Путаница здесь в том, как работают генераторы псевдослучайных чисел.
Генераторы псевдослучайных чисел, такие как rand
в C, работают, имея число, представляющее текущее «состояние». Каждый раз, когда вызывается функция rand
, выполняются некоторые детерминированные вычисления для номера «состояния», чтобы получить следующий номер «состояния». Таким образом, если генератору дан тот же вход (то же «состояние»), он будет производить тот же выход.
Итак, когда вы заполняете генератор с помощью srand(74)
, он всегда будет генерировать одну и ту же строку чисел каждый раз. Когда вы заполняете генератор с помощью srand(75)
, он сгенерирует другую строку чисел и т. Д.
Обычный способ обеспечить каждый раз разный вывод - всегда предоставлять другое начальное значение, обычно это делается путем заполнения генератора текущим временем в секундах / миллисекундах, например srand(time(NULL))
.
РЕДАКТИРОВАТЬ: вот сеанс Python, демонстрирующий это поведение. Это вполне ожидаемо.
>>> import random
Если мы заполним генератор одним и тем же номером, он всегда будет выводить одну и ту же последовательность:
>>> random.seed(500)
>>> [random.randint(0, 100) for _ in xrange(20)]
[80, 95, 58, 25, 76, 37, 80, 34, 57, 79, 1, 33, 40, 29, 92, 6, 45, 31, 13, 11]
>>> random.seed(500)
>>> [random.randint(0, 100) for _ in xrange(20)]
[80, 95, 58, 25, 76, 37, 80, 34, 57, 79, 1, 33, 40, 29, 92, 6, 45, 31, 13, 11]
>>> random.seed(500)
>>> [random.randint(0, 100) for _ in xrange(20)]
[80, 95, 58, 25, 76, 37, 80, 34, 57, 79, 1, 33, 40, 29, 92, 6, 45, 31, 13, 11]
Если мы дадим ему другое семя, даже немного другое, числа будут полностью отличаться от старого семени, но все равно останутся такими же, если используется то же (новое) семя:
>>> random.seed(501)
>>> [random.randint(0, 100) for _ in xrange(20)]
[64, 63, 24, 81, 33, 36, 72, 35, 95, 46, 37, 2, 76, 21, 46, 68, 47, 96, 39, 36]
>>> random.seed(501)
>>> [random.randint(0, 100) for _ in xrange(20)]
[64, 63, 24, 81, 33, 36, 72, 35, 95, 46, 37, 2, 76, 21, 46, 68, 47, 96, 39, 36]
>>> random.seed(501)
>>> [random.randint(0, 100) for _ in xrange(20)]
[64, 63, 24, 81, 33, 36, 72, 35, 95, 46, 37, 2, 76, 21, 46, 68, 47, 96, 39, 36]
Как сделать так, чтобы наша программа каждый раз вел себя по-разному? Если мы предоставим одно и то же семя, оно всегда будет вести себя одинаково. Мы можем использовать функцию time.time()
, которая будет выдавать другое число каждый раз, когда мы ее вызываем:
>>> import time
>>> time.time()
1347917648.783
>>> time.time()
1347917649.734
>>> time.time()
1347917650.835
Так что, если мы продолжим повторно заполнять его с помощью вызова time.time()
, мы будем каждый раз получать другую последовательность чисел, потому что семя каждый раз разное:
>>> random.seed(time.time())
>>> [random.randint(0, 100) for _ in xrange(20)]
[60, 75, 60, 26, 19, 70, 12, 87, 58, 2, 79, 74, 1, 79, 4, 39, 62, 20, 28, 19]
>>> random.seed(time.time())
>>> [random.randint(0, 100) for _ in xrange(20)]
[98, 45, 85, 1, 67, 25, 30, 88, 17, 93, 44, 17, 94, 23, 98, 32, 35, 90, 56, 35]
>>> random.seed(time.time())
>>> [random.randint(0, 100) for _ in xrange(20)]
[44, 17, 10, 98, 18, 6, 17, 15, 60, 83, 73, 67, 18, 2, 40, 76, 71, 63, 92, 5]
Конечно, даже лучше, чем постоянно пересевать, - это засеять один раз и продолжать дальше:
>>> random.seed(time.time())
>>> [random.randint(0, 100) for _ in xrange(20)]
[94, 80, 63, 66, 31, 94, 74, 15, 20, 29, 76, 90, 50, 84, 43, 79, 50, 18, 58, 15]
>>> [random.randint(0, 100) for _ in xrange(20)]
[30, 53, 75, 19, 35, 11, 73, 88, 3, 67, 55, 43, 37, 91, 66, 0, 9, 4, 41, 49]
>>> [random.randint(0, 100) for _ in xrange(20)]
[69, 7, 25, 68, 39, 57, 72, 51, 33, 93, 81, 89, 44, 61, 78, 77, 43, 10, 33, 8]
person
Claudiu
schedule
17.09.2012
rand
плох во многих отношениях, и это один из них. - person Keith Randall   schedule 18.09.2012