Можно ли в C# получить рандомные числа по алгориитму функции rand() в С++ ?
От: Skipper_N  
Дата: 16.08.14 08:35
Оценка:
Во всех компиляторах C++ Microsoft, были такие функции — srand принимающая unsigned int, от которого зависело какое то стартовое состояние, а затем функция rand выдавала последовательность рандомных чисел. Например, код

unsigned int gamenumber = 92;
srand(gamenumber);

int u = rand(); // 1-е полученное рандомное число 339
u = rand(); // полученное рандомное число 13532
u = rand(); // полученное рандомное число 26342
...


и так далее. Диапазон выдаваемых функцией rand() значений — 0-32768. А функция srand могла принять 4 миллиарда стартовых состояний. При передаче unsigned int (seed) — в функцию srand, мы могли получить 4 миллиарда различных последовательностей псевдослучайных чисел, и при передаче определенного стартового состояния (в приведенном коде, я передаю 92), на выходе будет всегда одинаковая последовательность случайных чисел, что собственно, и нужно.

Я хочу одну программку с логикой написанной на C++, перевести на C#, и сделать в .NET. Потому мне нужно, чтобы при передаче тех же стартовых состояний (как в примере, 92), получить на выходе те же последовательности рандомных чисел. Код, аналогичный выше приведенному, на C# такой —

int gamenumber = 92;
System.Random random = new System.Random(gamenumber);

int u = random.Next();
u = random.Next();
u = random.Next();
...

На выходе получается другая последовательность рандомных чисел, что не годится. Как получить такую же, как в компиляторе C++ ? В C# random.Next(); возвращает числа в диапазоне от 0 до 4 миллиардов, я попробовал вызывать, задаваю нужный даипазон как в C++ —

int u = random.Next(32768);

все равно на выходе другая последовательность случайных чисел. Попробовал так —

int u = random.Next() % 32768;

и всё равно на выходе другая последовательность случайных чисел... А ведь данный алгоритм Microsoft генерации случайных чисел существовал десятилетия и для всех компиляторов C++. Потому я предположил, что видимо он очень удачный, и используется в C#. Может, есть какое то соответствие? Т.е. можно как-нибудь, задав то же стартовое значение, получить такую же последовательность случайных чисел как в C++ ?

Если кто знает, подскажите. Заранее, спасибо.
Re: Можно ли в C# получить рандомные числа по алгориитму функции rand() в С++ ?
От: tdiff  
Дата: 16.08.14 08:42
Оценка:
Здравствуйте, Skipper_N, Вы писали:

S_N>Во всех компиляторах C++ Microsoft, были такие функции — srand принимающая unsigned int, от которого зависело какое то стартовое состояние, а затем функция rand выдавала последовательность рандомных чисел. Например, код


Возможно, может получиться вызывать реализацию CRT-шного rand() из С# через какой-нибудь PInvoke?
Re: Можно ли в C# получить рандомные числа по алгориитму функции rand() в С++ ?
От: btn1  
Дата: 16.08.14 08:46
Оценка:
Здравствуйте, Skipper_N, Вы писали:

S_N>...на выходе будет всегда одинаковая последовательность случайных чисел, что собственно, и нужно.


Нда... вот и выросло поколение, не способное записать в файл десяток чисел!
Re: Можно ли в C# получить рандомные числа по алгориитму функции rand() в С++ ?
От: Аноним  
Дата: 16.08.14 08:49
Оценка: +4
Здравствуйте, Skipper_N, Вы писали:
S_N> Т.е. можно как-нибудь, задав то же стартовое значение, получить такую же последовательность случайных чисел как в C++ ?

Исходники CRT идут вместе со студией. У меня, например, в C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\crt\src\rand.c:

void __cdecl srand (
        unsigned int seed
        )
{
        _getptd()->_holdrand = (unsigned long)seed;
}

int __cdecl rand (
        void
        )
{
        _ptiddata ptd = _getptd();

        return( ((ptd->_holdrand = ptd->_holdrand * 214013L
            + 2531011L) >> 16) & 0x7fff );
}
Re[2]: Можно ли в C# получить рандомные числа по алгориитму функции rand() в С++
От: Pavel Dvorkin Россия  
Дата: 16.08.14 09:01
Оценка:
Здравствуйте, tdiff, Вы писали:


T>Возможно, может получиться вызывать реализацию CRT-шного rand() из С# через какой-нибудь PInvoke?


И тащить за собой С++ CRT ?
With best regards
Pavel Dvorkin
Re[2]: Можно ли в C# получить рандомные числа по алгориитму
От: Skipper_N  
Дата: 16.08.14 09:03
Оценка:
Здравствуйте, btn1, Вы писали:

B>Здравствуйте, Skipper_N, Вы писали:


S_N>>...на выходе будет всегда одинаковая последовательность случайных чисел, что собственно, и нужно.


B>Нда... вот и выросло поколение, не способное записать в файл десяток чисел!



Если вы не знаете зачем мне это нужно, то не говорите, что можно записать в файл. Программа — логическая игра, я хочу чтобы она была совместима с предыдущей версией, написанной на C++. Причем тут файл с десятком чисел? В принципе можно, только в таком случае мне в файле надо будет хранить сотни миллионов чисел. предлагаете добавить к программе файл весом в много сотен мегабайт? И тому кто захочет скачать, предлагать скачивать и этот файл?
Отредактировано 16.08.2014 9:10 Skipper_N . Предыдущая версия . Еще …
Отредактировано 16.08.2014 9:04 Skipper_N . Предыдущая версия .
Re[2]: Можно ли в C# получить рандомные числа по алгориитму функции rand() в С++
От: Аноним  
Дата: 16.08.14 09:03
Оценка:
Здравствуйте, Аноним, Вы писали:

Только нужно не забыть, что в MS C++ и int и long 32 битные, в отличеие от C#, где long = Int64
Re[2]: Можно ли в C# получить рандомные числа по алгориитму
От: Skipper_N  
Дата: 16.08.14 09:26
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Skipper_N, Вы писали:

S_N>> Т.е. можно как-нибудь, задав то же стартовое значение, получить такую же последовательность случайных чисел как в C++ ?

А>Исходники CRT идут вместе со студией. У меня, например, в C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\crt\src\rand.c:


А>
А>void __cdecl srand (
А>        unsigned int seed
А>        )
А>{
А>        _getptd()->_holdrand = (unsigned long)seed;
А>}

А>int __cdecl rand (
А>        void
А>        )
А>{
А>        _ptiddata ptd = _getptd();

А>        return( ((ptd->_holdrand = ptd->_holdrand * 214013L
А>            + 2531011L) >> 16) & 0x7fff );
А>}
А>




return( ((ptd->_holdrand = ptd->_holdrand * 214013L
+ 2531011L) >> 16) & 0x7fff );


Это что, вся реализация алгоритма получения рандомного числа что ли? А я то думал, что там какой сложный алгоритм.
Спасибо. Буду экспериментировать с исходниками.
Отредактировано 16.08.2014 9:38 Skipper_N . Предыдущая версия .
Re[3]: Можно ли в C# получить рандомные числа по алгориитму
От: TK Лес кывт.рф
Дата: 19.08.14 06:03
Оценка:
Здравствуйте, Skipper_N, Вы писали:

S_N>Спасибо. Буду экспериментировать с исходниками.


Проще начать с экспериментов по импорту rand/srand из соответствующей dll
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[3]: Можно ли в C# получить рандомные числа по алгориитму
От: hardcase Пират http://nemerle.org
Дата: 19.08.14 08:50
Оценка:
Здравствуйте, Skipper_N, Вы писали:

S_N>Это что, вся реализация алгоритма получения рандомного числа что ли? А я то думал, что там какой сложный алгоритм.


Регистры сдвига довольно простые штуковины
За криптографически стойкими последовательностями случайных чисел нужно ходить к CryptoAPI в виндах.
/* иЗвиНите зА неРовнЫй поЧерК */
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.