2011-04-25 1 views
1

J'ai joué et j'ai écrit ce petit morceau de code. J'essaie de lancer une pièce de monnaie définie nombre de fois et ensuite compter combien de queues et de têtes je reçois. Alors voilà:Retourner un problème de pièce

private void Start_Click(object sender, EventArgs e) 
{ 
    int headss = 0; 
    int tailss = 0; 
    int random2, g; 
    string i = textBox1.Text; 
    int input2, input; 
    bool NumberCheck = int.TryParse(i, out input2); 

    if (textBox1.Text == String.Empty) // check for empty string, when true 
     MessageBox.Show("Enter a valid number between 0 and 100000."); 
    else // check for empty string, when false 
     if (!NumberCheck) // number check, when false 
     { 
      textBox1.Text = String.Empty; 
      MessageBox.Show("Enter a valid number between 0 and 100000."); 
     } 
     else 
     { 
      input = Convert.ToInt32(textBox1.Text); 

      for (g = 0; g < input; g++) 
      { 
       Random random = new Random(); 
       random2 = random.Next(2); 

       if (random2 == 0) 
       { 
        headss++; 
       } 
       else if (random2 == 1) 
       { 
        tailss++; 
       } 
      } 
     } 

    heads.Text = Convert.ToString(headss); 
    tails.Text = Convert.ToString(tailss); 
} 

Le problème est que je continue d'avoir des problèmes lors de l'affichage du contenu. Ce n'est même pas près d'afficher leur bon résultat. Des idées?

EDIT. Solution: se déplacer suivant la ligne 3 lignes jusqu'à: D

Random random = new Random(); 
+4

L'affichage semble correct, mais le retournement n'est pas bon. Le seed par défaut de 'Random' est basé sur l'horloge du système, dont la résolution n'est pas très bonne. En créant un nouvel objet 'Random' chaque fois dans la boucle, vous obtiendrez la même graine encore et encore pour de nombreuses itérations, ainsi vos flips ne seront pas très aléatoires. – mquander

Répondre

5

Au lieu de

for (g = 0; g < input; g++) 
{ 
    Random random = new Random(); 
    random2 = random.Next(2); 
} 

Déclarer un Random pour une utilisation tout au long:

private Random randomGenerator = new Random(); 
private void Start_Click(object sender, EventArgs e) 
{ 
    // ... 
    for (g = 0; g < input; g++) 
    { 
     random2 = randomGenerator.Next(2); 
    } 
    // ... 
} 
+0

Merci. Ce travail pour moi. Par hasard, y a-t-il une différence de performance entre eux? – HelpNeeder

+0

Cette nouvelle façon est meilleure, mais probablement pas mesurable. – bendewey

+1

En règle générale, diriez-vous que recréer un objet encore et encore est plus lent que de réutiliser un objet? –

4

Vous devez utiliser un seul objet aléatoire pour générer une bonne (aussi bien par défaut au hasard fait) un ordre aléatoire.

+0

oeil aiguisé :) merci, fonctionne maintenant. – HelpNeeder

2

Le constructeur par défaut pour random prend le temps systmem comme seed. Par conséquent, si vous en générez beaucoup dans un court laps de temps, ils généreront tous la même séquence de nombres aléatoires. Tirez l'objet aléatoire hors de la boucle et cet effet ne se produira pas.

0

Avec RandomGenerator. Ce code comptera combien de fois la pièce a été retournée. Il se terminera avec 3 HEADS consécutifs.

private RandomGenerator rgen = new RandomGenerator(); 

public void run() { 

    int value = 0; 
    int total = 0; 
    while (value != 3) { 
     String coinFlip = rgen.nextBoolean() ? "HEADS" : "TAILS"; 
     println (coinFlip); 
     if (coinFlip == "HEADS") { 
      value+=1; 
     } else { 
      value=0; 
     } 
     total +=1; 
    } 
    println ("It took "+total+" flips to get 3 consecutive heads");  
} 
Questions connexes