2013-03-02 2 views
3

Я пытаюсь перенести некоторый код из UNIX в Windows, и мне нужна реализация функций POSIX srandom(x) и random(), которые для данного семени x сгенерируют такую ​​же последовательность чисел, что и для POSIX.1- 2001. Каковы некоторые из доступных опций в Windows?Windows-эквивалент функций POSIX srandom (...) и random()?

ответ

5

srandom и семья являются членами Glibc. Скорее всего, вы можете скопировать the source code from glibc для srandom/random в ваше приложение, если оно совместимо с лицензией. Если вы ищете другую реализацию, любой небольшой амур

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

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

Как уже отмечался в комментариях по JWWalker, есть довольно хороший boost random implementation, который обеспечивает хороший набор C++ классов для случайных чисел, но это C++, не C - другой язык, так что, вероятно, непосредственно не подходит.

+0

Для генераторов случайных чисел с открытым исходным кодом см. [Случайная библиотека Boost] (http://www.boost.org/doc/libs/1_61_0/doc/html/boost_random/reference.html). – JWWalker

+0

Ссылки мертвы. Я получил файл, который мне нужно скомпилировать, что мне делать, чтобы заменить srandom? –

+0

@ TomášZato Я обновил ссылку, чтобы указать на ссылку на источник для glibc random.c, которая должна оставаться в живых в обозримом будущем. Это код glibc и имеет лицензию, связанную с ним, что может сделать его непригодным для использования. – Petesh

1

Вы можете проверить функции rand_s и srand в Windows. Но я не уверен, соответствуют ли они стандартам POSIX.

EDIT

Лучше один, кажется, CryptGenRandom. Проверьте это link.

+0

'rand_s' не использует семя, установленное' srand', а 'rand' возвращает 15-битное случайное число, в отличие от 31-битного случайного числа, возвращаемого' random'. – JWWalker

0

Если вы ищете какой-то простой генератор псевдослучайных вы можете использовать генератор линейного сравнения http://en.wikipedia.org/wiki/Linear_congruential_generator

например. первый пример:

unsigned int seed = 2; 

unsigned int rand() 
{ 
    seed = 1664525 * seed + 1013904223; 
    return x; 
} 

void srand(unsigned int new_seed) 
{ 
    seed = new_seed; 
} 
+1

Следите за ** Неопределенное поведение **! Вы можете избежать UB с помощью 'unsigned' вместо – pmg

+0

вы правы ... -> edit –

+2

Это не компилируется. Что такое переменная 'x'? – swdev