2012-05-22 4 views
0

Nous avons un bouton. L'utilisateur cliquant sur le bouton et recevoir action1 ou action2 dépend de la variable percent_to_action2 (de 0 à 100). Le moyen le plus simple de lui donner action1 ou action2 est basé sur rand() % 100 et la comparaison avec percent_to_action2.cpp Afficher le résultat dépend du résultat précédent

Mais le problème est que si par exemple. perfect_to_action = 50 il n'y a aucune garantie qu'après le premier utilisateur aléatoire action1 obtiendra action2 (par rand()). Je cherche les moyens d'éviter de nombreuses actions répétées. S'il vous plaît, suggère comment compter plus précisément compte tenu de l'événement précédent/ou tous les événements. avec des exemples et des commentaires. L'objectif est d'éviter un nombre excessif d'actions répétées que rund() peut donner. par exemple avec un pourcentage = 50 rand() peut donner 10/10 action2!

ps. perfect_to_action peut être modifié à tout moment.
pps. désolé pour moi anglais.

mon code:

   int num_rand = (rand() % 100) + 1; // from 1 to 100 
       if ( num_rand <= current_percent_to_action2) 
       { 
        // action 1 
       } else {} // action2 

Ce que je veux dans les exemples:

pour cent = 50: action1 que action2 que action1 que action2 etc.

pour cent = 33: (premier par rand) si première action1 que action1 que action2 que action1 que action1 que action2 etc.

+0

Pouvez-vous montrer du code? –

+1

Vous nous avez donné votre modèle actuel, mais vous ne nous avez pas dit ce que vous modélisez. Quelles sont ces actions? [Quel est votre objectif] (http://www.catb.org/esr/faqs/smart-questions.html#goal)? – GManNickG

+0

Est-ce que ce sont les devoirs? Considérez le marquage en tant que tel. Cela pourrait amener les gens à avoir un peu plus de patience. Je trouve cette question inintelligible en ce moment – sehe

Répondre

1
static unsigned num_action_1 = 1; 
static unsigned num_action_2 = 1; 
double bias = double(num_action_2)/num_action_1; 
double randomchance = 1.0-current_percent_to_action2/100.0; 
double action_1_cutoff = RAND_MAX*randomchance*bias; 
if ( rand() <= action_1_cutoff) { 
    // action 1 
    ++num_action_1; 
} else { 
    // action2 
    ++num_action_2; 
} 

Ceci biaisera le caractère aléatoire vers l'option qui s'est produite moins fréquemment. Je l'ai également changé pour que l'action 2 se produise à peu près current_percent_to_action2 pour cent du temps, au lieu de l'action 1 comme dans votre code. Comme vous pouvez le voir sur ce graphique, cela ajoute beaucoup de complexité, mais vous êtes beaucoup moins susceptible d'obtenir un nombre de résultats déséquilibré. À long terme, ceux-ci finiront par être quasiment identiques, les deux donneront des ficelles de 10 à la suite, ce code commence tout juste plus encore.

times #1  Even distribution Biased distribution 
    1    50%     50% 
    2    25%     8.3% 
    3    12.5%     3.125% 
    4    6.25%    1.25% 
    5    3.13%    0.52% 
    6    1.56%    0.22% 
    7    0.78%    0.09% 
    8    0.39%    0.04% 
    9    0.20%    0.02% 
    10    0.10%    0.01% 
+0

'action_1_cutoff' a été compté, mais pas utilisé. semble besoin de comparer avec rand()? – abrahab

+0

@abrahab: whoops, bonne prise sur cette faute de frappe. –

0

Si vous ne voulez pas que les actions soient répétées, vous pouvez: a) choisir TOUTE la dernière action, ou b) choisir comme vous le faites maintenant, mais continuer à choisir jusqu'à obtenir autre chose que l'action précédente. Ce dernier est plus facile à faire, mais il est plus lent (peut-être beaucoup plus lent).

Questions connexes