Как использовать генератор случайных чисел в С#?

Я создал приложение Windows Forms с помощью Visual Studio Professional на C#. В моей программе я предлагаю пользователю ввести количество рулонов, которое он хочет, а затем он нажимает клавишу ввода, чтобы получить числа.

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

Вот что я делаю:

Random randGen = new Random;
int oneRoll = randGen.Next(1,7) + randGen(1, 7);

Я хочу, чтобы одна и та же программа выполнялась столько раз, сколько захочет пользователь. Я попробовал цикл for, но не смог получить то, что хотел.


person Vishal1949    schedule 28.07.2011    source источник
comment
Что получил цикл? И как выглядела ваша петля?   -  person Tomas Aschan    schedule 29.07.2011
comment
for (int i = 0; i ‹= numRolls; i++) i = oneroll;   -  person Vishal1949    schedule 29.07.2011


Ответы (4)


Убедитесь, что вы создали генератор случайных чисел только один раз.

НЕ создавайте его в каждой итерации цикла.

Или числа могут быть не случайными, потому что цикл настолько тесный, что он будет использовать то же время, что и начальное значение во внутреннем генераторе.

person Steve Wellens    schedule 28.07.2011

Попробуйте что-то вроде этого:

Random randGen = new Random();
var rolls = new List<int>();
int sum = 0;
for (int i = 0; i < numberOfRolls; i++)
{
    int randomNum1 = randGen.Next(1,7);
    int randomNum2 = randGen.Next(1,7);
    sum += randomNum1 + randomNum2;
    rolls.Add(randomNum1);
    rolls.Add(randomNum2);
}

Теперь все отдельные броски в бросках, и их сумма уже подсчитана.

Отредактировано для броска двух игральных костей, записи результатов по отдельности и суммирования результатов.

person Tim S.    schedule 28.07.2011
comment
Мне нужно использовать два кубика, поэтому я бы использовал randGen.Next(1, 7) + randGen.Next(1, 7); Итак, как мне сгенерировать то, что пользователь вводит, например, что, если он вводит 1000 для количества бросков костей. Как заставить программу повторяться 1000 раз? - person Vishal1949; 29.07.2011
comment
Если вы хотите вести учет различных (виртуальных) номеров кубиков, вы можете хранить их отдельно, как я только что отредактировал. - person Tim S.; 29.07.2011
comment
Вам нужно получить пользовательский ввод в форме int, в переменной numberOfRolls. В приложении Windows Forms самый простой способ сделать это — создать текстовое поле, которое пользователь может ввести, а затем, когда он нажмет кнопку, чтобы бросить кубик, вы выполните следующий код для его анализа: int numberOfRolls = int.Parse(myTextBox.Text);. Затем введите код, который у меня есть, и он будет повторяться 1000 раз. - person Tim S.; 29.07.2011
comment
Я преобразовал все, что было нужно, все, что мне нужно знать, это как свернуть одно и то же количество раз, которое является вводом. - person Vishal1949; 29.07.2011

int rolls = Console.ReadLine();
int total = 0; 
Random randGen = new Random(System.DateTime.Now.Millisecond);
for(int i =0; i<rolls; i++)
{
int oneRoll = randGen.Next(1,7) + randGen.Next(1, 7);
Console.WriteLine("Rolled " + oneRoll);
total += oneRoll;
}

Console.WriteLine("Total " + total);

NB. вам не нужен миллисекундный бит, начальное значение просто делает его более случайным

person Tom Squires    schedule 28.07.2011
comment
Воссоздавать новый Random на каждой итерации — плохая идея. - person user703016; 29.07.2011
comment
Мне нужно использовать два кубика, поэтому я бы использовал randGen.Next(1, 7) + randGen.Next(1, 7); Итак, как мне сгенерировать то, что пользователь вводит, например, что, если он вводит 1000 для количества бросков костей. Как заставить программу повторяться 1000 раз? - person Vishal1949; 29.07.2011
comment
@Vishal1949 Vishal1949, если пользователь введет 1000, тогда этот код сработает, попробуйте. rolls будет 1000, поэтому он будет проходить 1000 раз, каждый раз генерируя два числа от 1 до 6 и добавляя их к вашей сумме. - person Tom Squires; 29.07.2011

Ваш код совершенно неверен...

Random randGen = new Random(DateTime.Now.Ticks); // unique seed, mostly
int result = 0;
for (int i = 0; i < number_of_rolls_the_user_wants; i++)
    result += randGen.Next(2, 14); // (1 - 7) + (1 - 7) = 2 - 14 lol... >.>

Замените number_of_rolls_the_user_wants количеством рулонов, которое хочет пользователь. result будет хранить результат.

Также обратите внимание, что если вы генерируете много случайных чисел за короткое время, используйте один и тот же объект Random!

person Vercas    schedule 28.07.2011
comment
Мне нужно использовать два кубика, поэтому я бы использовал randGen.Next(1, 7) + randGen.Next(1, 7); Итак, как мне сгенерировать то, что пользователь вводит, например, что, если он вводит 1000 для количества бросков костей. Как заставить программу повторяться 1000 раз? - person Vishal1949; 29.07.2011
comment
Прочтите, что я сказал после кода... замените эту переменную количеством раз. - person Vercas; 29.07.2011
comment
randGen.Next(2, 14) (на самом деле должно заканчиваться на 13) не совпадает с randGen.Next(1, 7) + randGen.Next(1, 7). например Выпадение 2 гораздо менее вероятно при броске двух костей, чем 7. - person Tim S.; 29.07.2011
comment
Да, мистер Математик! Итак, если вы добавите два случайных числа от 1 до 7, вы получите случайное число от 2 до 13? Что, если ОБЕ 7? - person Vercas; 29.07.2011
comment
Найдите Random.Next(x, y). Случайное число n равно x ‹= n ‹ y, а не x ‹= n ‹= y. Также поспорьте, что если мы бросим пару игральных костей 100 раз, то 2 выпадет целых 7. Я дам вам подсказку: я выиграю. - person Tim S.; 29.07.2011
comment
@Tim S. Наконец-то я понял... Вы не можете получить 7 два раза подряд с обычным Random... Но он хочет кости, которые являются реальными объектами, и они МОГУТ БРОСАТЬСЯ ОБА 7. Возможно, вы на мгновение потеряли контакт с реальностью. ›.› - person Vercas; 30.07.2011
comment
Это был бы очень плохой генератор псевдослучайных чисел, который не мог бы выдать одно и то же число дважды подряд. Я хочу сказать, что .Next(1, 7) означает, что он производит число от 1 до 6. Это означает, что сумма двух из них может быть от 2 до 12. Это не означает, что это то же, что и .Next(2, 13). Кроме того, у большинства игральных костей 6 граней, поэтому они не могут оба выбросить 7. Вместе они дают в сумме 7, а по отдельности где-то от 1 до 6. 3 является более вероятной суммой двух игральных костей, чем 2, так как она может быть составлена ​​из 1+2 или 2+1, где 2 может быть только 1+1. Мне кажется, это ты потерял связь с реальностью. - person Tim S.; 30.07.2011