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