Во-первых: Сделайте not использовать _1 _ а>. Здесь являются достаточно лучше альтернативы.
Даже версия стандарта C 1 2011 года говорит в сноске 295:
Нет никаких гарантий относительно качества создаваемой случайной последовательности, и известно, что некоторые реализации создают последовательности с крайне неслучайными битами младшего разряда. Приложения с особыми требованиями должны использовать генератор, который, как известно, достаточен для их нужд.
Если это вас не убедило, позвольте мне сделать акцент:
Нет никаких гарантий относительно качества созданной случайной последовательности, и известно, что некоторые реализации создают последовательности с удручающе неслучайными младшие биты. Приложения с особыми требованиями должны использовать генератор, который, как известно, достаточен [читай: не этот] для их нужд.
Однако, если вы решите использовать его вопреки всем причинам, C99 7.20.2.2 и C11 7.22.2.2 определяют функцию srand
следующим образом:
(2) Функция srand использует аргумент в качестве начального числа для новой последовательности псевдослучайных чисел, возвращаемой при последующих вызовах rand. Если затем srand вызывается с тем же начальным значением, последовательность псевдослучайных чисел должна быть повторена. Если rand вызывается до того, как были сделаны какие-либо вызовы srand, должна быть сгенерирована та же последовательность, что и при первом вызове srand с начальным значением 1.
(3) [...] Реализация должна вести себя так, как если бы ни одна библиотечная функция не вызывала функцию srand.
Это означает 2, что либо ваша стандартная библиотека не работает, вы вызываете неопределенное поведение (например, запись в память, в которую не следует писать) или действительно имеете какой-то другой источник недетерминизма. Как вы наверняка знаете, наиболее распространенными источниками недетерминизма являются многопоточность и чтение ввода (клавиатура, время и т. Д.). Обратите внимание, что вызов _3 _ / _ 4_ из нескольких потоков по своей сути небезопасен 3, кроме порядка выполнения.
Поскольку rand
средства генерации случайных чисел имеют только одно центральное состояние, вам также следует знать библиотеки, используемые вашим кодом, также могут его изменять, поэтому ваша проблема может скрываться в каком-то невинном вызове библиотечной функции (за исключением стандартной библиотеки).
Позвольте мне также повторить, что алгоритм, используемый rand
, не указан. Следовательно, разные компиляторы (точнее, разные стандартные библиотеки) могут и будут выдавать разные случайные числа.
Наконец, позвольте мне еще раз сказать, что вам следует не использовать _7 _ если это вообще возможно.
Если остались сомнения относительно того, что вам следует делать сейчас, просто взгляните на следующую полностью совместимую со стандартами реализацию srand
и rand
:
#define RAND_MAX 32767
static int _rand_state = 1;
void srand(unsigned int seed) { _rand_state = (int)(seed % 32768); }
int rand() { return (++_rand_state) % 32768; }
Сноски:
1. Если вы используете Linux, справочная страница rand(3)
соглашается: «в более старых реализациях rand () и в текущих реализациях в различных системах биты более низкого порядка гораздо менее случайны, чем биты более высокого порядка. Не используйте эту функцию в приложениях, предназначенных для переносимости, когда требуется хорошая случайность».
2. В сочетании с C99 7.20.2.1/3 или C11 7.22.2.1/3, что гарантирует, что реализация ведет себя так, как если бы srand
и rand
никогда не вызывались какой-либо стандартной библиотечной функцией.
3. C11 явно разрешает гонку данных при использовании этих функций (C11 7.22.2.1/3 и C11 7.22.2.2/3), и C99 сделал бы то же самое, если бы знал концепцию потоков и безопасность потоков.
person
gha.st
schedule
06.02.2015
seed(0)
AFAIK. - person πάντα ῥεῖ   schedule 07.02.2015srand()
, затем несколько вызововstd::cout << rand() << "\n";
. Это все еще происходит? Например, ideone.com/U14x0g. - person indiv   schedule 07.02.2015rand()/(RAND_MAX+1.0)
может привести к разным результатам (особенно если вы используете алгоритм, который объединяет ошибки), я не думаю, что существует какое-либо стандартное требование, чтобы это деление выполнялось с одинаковой точностью или раундами в одном и том же направлении каждый раз. - person M.M   schedule 07.02.2015Yes, I did try that. But then there is no issue
часть, на случай, если это было неясно) - person Jcl   schedule 07.02.2015