Проблема с подбрасыванием монеты

#c# #coin-flipping

#c# #подбрасывание монеты

Вопрос:

Я поигрался и написал этот небольшой фрагмент кода. Я пытаюсь подбросить монету определенное количество раз, а затем подсчитать, сколько решек и орлов я получаю. Итак, вот оно:

 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);
}
  

Проблема в том, что я продолжаю получать проблемы при отображении содержимого. Это даже близко не к отображению правильного результата. Есть идеи?

Редактировать. Решение: переместить следующую строку на 3 строки вверх: D

 Random random = new Random();
  

Комментарии:

1. Отображение кажется нормальным, но переворачивание происходит неправильно. Random Начальное значение по умолчанию основано на системных часах, разрешение которых не так велико. Создавая новый Random объект каждый раз в цикле, вы будете получать одно и то же начальное значение снова и снова на протяжении многих итераций, поэтому ваши перевороты не будут очень случайными.

Ответ №1:

Вместо

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

Объявить один Random для использования во всем:

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

Комментарии:

1. Спасибо. Это работает для меня. Случайно, есть разница в производительности между ними?

2. Этот новый способ лучше, но, вероятно, не поддается измерению.

3. Как эмпирическое правило, вы бы сказали, что повторное создание объекта снова и снова происходит медленнее, чем повторное использование одного объекта?

Ответ №2:

Вы должны использовать только один случайный объект, чтобы сгенерировать хорошую (такую же хорошую, как по умолчанию Random) случайную последовательность.

Ответ №3:

Конструктор по умолчанию для random принимает время systmem за начальное значение. Следовательно, если вы сгенерируете их много за короткий промежуток времени, все они будут генерировать одну и ту же последовательность случайных чисел. Извлеките случайный объект из цикла, и этого эффекта не произойдет.

Ответ №4:

С RandomGenerator . Этот код подсчитает, сколько раз монета была подброшена. Это закончится 3 последовательными выпадениями.

 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");     
}