Если я бегу, что код пару раз, я получаю различный результат. Конечно, не так разнообразен, как хотелось бы, но, по-видимому, не детерминирован (хотя, конечно, это так, поскольку rand()
дает только псевдослучайные числа ...).
Однако, как вы относитесь к своим номерам, вы не получите равномерного распределения по сравнению с [1,20], и я думаю, это то, что вы ожидаете. Достичь этого довольно сложно, но никоим образом невозможно. Например, посмотрите на documentation for <random>
at cplusplus.com - внизу есть программа витрины, которая генерирует равномерное распределение по [0,1). Чтобы получить это до [1,20], вы просто меняете входные параметры на генератор - это может дать вам равномерное распределение по любому интересующему вас диапазону.
Я сделал быструю проверку и назвал rand()
миллион раз. Как видно из приведенного ниже результата, даже при очень больших размерах выборки, в распределении есть некоторая неоднородность. По мере того, как количество отсчетов переходит в бесконечность, линия будет (вероятно) сглаживаться, используя что-то вроде rand() % 20 + 1
, дает вам распределение, которое принимает очень долгое время для этого. Если вы возьмете что-то еще (например, пример выше), ваши шансы лучше достичь равномерного распределения даже при довольно небольших размерах выборки.
Edit:
Я вижу некоторые другие публикации об использовании srand()
семян генератора случайных чисел перед использованием. Это хороший совет, но в этом случае он не решит вашу проблему. Повторяю: Посев не является проблемой в этом случае.
Семена используются главным образом для контроля воспроизводимости выходных данных вашей программы. Если вы засеваете свое случайное число с постоянным значением (например, 0), программа будет давать один и тот же результат каждый раз, что полезно для тестирования того, что все работает так, как должно. При посеве чего-то непостоянным (текущее время является популярным выбором) вы гарантируете, что результаты будут различаться между различными прогонами программы.
Не созвониться srand()
совсем не то же самое, что и вызов srand(1)
по стандарту C++. Таким образом, вы будете получать одинаковые результаты каждый раз, когда запускаете программу, но в каждом прогоне вы получите вполне допустимую серию псевдослучайных чисел.
'something% 1' всегда дает 0. Был ли он' rand()% 20 + 1'? –
Вам нужно засеять случайное. Посмотрите на 'srand'. Люди часто используют 'time()' в качестве семени (хотя это не обязательно хорошая практика). – RageD
@RageD: Вам нужно вызвать 'srand()' точно * один раз * перед любыми вызовами 'rand()'. –