Почему функция rand в C+ при генерировании последовательностей орел-решка не может сгенерировать последовательности

не может сгенерировать последовательности боле 15 орлов\решек подряд?
8 года назад от Валентина Абрамян

2 Ответы



0 голосов
вобще-то "штатная" функция rand в стандартной сишной библиотеке - вобще безобразна, у не следующе число генериуется из предыдущего, причем состояние хратинся в 32-битовых long, а значит максимальная длина последовательности, которую она выдает - 2^32-1 (0 - не бывает) , после этого все идет по циклу, так что если вы за этот цикл не встретили то, что искали - не встретите никогда.

собственно, у любого алгоритма псевдослучайных чисел есть цикл. Есть способы существенного удлинения этого цикла - но он всегда конечен.

если бы числа были действительно случайными, то вероятность встретить была бы 1/2^15, то есть вам потребовалось бы перебрать порядка 2^15 чисел.

можно использовать "замешивание", берется два датчика разной природы, один - хороший, второй - любой. Изначально первым датчиком заполняется буфер, скажем в 1013 чисел, затем при каждом обращении вторым датчиком выбирается одно число из буфера, его возвращают в качестве случайного а на его место пишется новое число, сгенерированное первым датчиком.

Ну и если вы хотите получать орлы и решки - надо брать старшие биты, чем младше бит - тем он мене случаен. Самый младший вобще чередуется 0-1-0.
8 года назад от Золотухин кирилл
0 голосов
Вот представь, у меня она после запуска всегда через одно и то же кол-во вызовов выдавала 15 орлов подряд.
Потом вставил srand (time (0) ; в начало main () , всё вылечилось - стала каждый раз за разное кол-во итераций выдавать 15 орлов.

Вопрос: какого хрена?
А я тебе скажу. Инициализация ГПСЧ (генератора псевдо-случайных чисел) - задача обычно (по времени) боле трудоемкая по сравнению с последующей генерацией оных большими пачками.
8 года назад от ..........

Связанные вопросы

3 ответов
2 года назад от Марк Марк
1 ответ