|
Xorshift ГПСЧ, есть вопросы |
|
|
|
Aug 27 2011, 18:43
|

Гуру
     
Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106

|
Натолкнулся вот на такой ГПСЧ : Код uint32_t xor128(void) { static uint32_t x = 123456789; static uint32_t y = 362436069; static uint32_t z = 521288629; static uint32_t w = 88675123; uint32_t t; t = x ^ (x << 11); x = y; y = z; z = w; return w = w ^ (w >> 19) ^ (t ^ (t >> 8)); } Возникло несколько вопросов: 1: x = 123456789; y = 362436069; z = 521288629; w = 88675123; Это ,я так понял, десятичные начальные значения переменных? 2: могут ли эти начальные значения быть любыми (кроме 0 конечно) или в них есть тайный смысл? 3: результатом работы ГПСЧ есть 32-х битное число, а если мне достаточно одного байта то какой (из 4-х байт) лучше использовать?
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Aug 28 2011, 09:57
|
Участник
  
Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695

|
Цитата(zombi @ Aug 28 2011, 03:43)  x = y; y = z; z = w; 1) да 2)Четыре 32-bit числа, сдвигаемые как одно целое, вместе составляют 128-bit число, в источнике указан период последовательности 2**128-1, т.е. в этих четырёх 32-bit переменных пробегают все значения, кроме 0,0,0,0. т.е. в качестве исходных значений можно взять любые, кроме 0,0,0,0. 3) Наверное любые, но сдвиги и маски затрагивают в основном 2 и 3 байт каждой переменной, м.б. в этих байтах шумит сильнее.
|
|
|
|
|
Aug 28 2011, 10:27
|
Участник
  
Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695

|
Цитата(zombi @ Aug 28 2011, 19:18)  Т.е. если взять 8-мь 32-х битных чисел то получим генератор с 2**256-1 последовательностью? и необходимо ли при этом менять количество и направление сдвигов? Эти, с виду простые формулы, очень чувствительны к количеству и направлению сдвигов. Можно взять вдвое больше переменных и, применив те же правила xor и сдвигов, получить даже меньший период повторения, чем у начальной формулы. Как находят эти "магические" формулы - я не знаю.
|
|
|
|
|
Aug 29 2011, 06:58
|
Участник
  
Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695

|
Google на запрос xorshift выдаёт второй строкой ссылку на публикацию автора алгоритма - George Marsaglia. В статье есть варианты для последовательностей шириной 32;64;96;128,160 бит и 2**192-2**32 (практически 192 бит).
|
|
|
|
|
Sep 1 2011, 12:34
|
Участник
  
Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695

|
Цитата(Dr.NoA @ Sep 1 2011, 21:06)  Что-то я не пойму следующее. Если автору темы требуются 8-битные случайные числа, то чем не устраивает 8-битный генератор с периодом 2^8-1? ... А если нужны отдельные десятичные цифры? период повторения =10 1728394056_1728394056_1728394056_... такая ПСП Вас устроит? сравните с дробной частью числа Пи: 1415926535_8979323846_2643383279_5028841971_6939937510_... А если нужны случайные двоичные числа? 1010101010101010101010101010101010101010 И довольствуемся этим как случайной последовательностью? в среднем 0.5 - всё нормально, ага? Полностью поддерживаю автора топика, пусть не 2^128, но 2^64 или 2^32, пусть даже 2^16 это для байтовой переменной - уже хорошо. Но не период = размерности переменной, это очень, очень заметно.
|
|
|
|
|
Sep 1 2011, 16:45
|

Гуру
     
Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106

|
Цитата(Dr.NoA @ Sep 1 2011, 15:06)  Что-то я не пойму следующее. Если автору темы требуются 8-битные случайные числа, то чем не устраивает 8-битный генератор с периодом 2^8-1? Т.е. через 255 шагов можно точно предсказать следующее значение rnd  это абсолютно не приемлемо для меня. Цитата(Dr.NoA @ Sep 1 2011, 15:06)  Какой смысл тратить ресурсы на 32-разрядный генератор, а потом брать только 8 бит, если все равно выходные значения в лучшем случае будут иметь период 2^8-1 ошибаетесь Цитата(Dr.NoA @ Sep 1 2011, 15:06)  (при этом еще большой вопрос на счет периода и свойств распределения этого выходного байта)? Если тесты на "случайность" одобряют этот алгоритм значит состояние любого бита тоже случайно и думаю что сколько бы бит из 32-х не взять (хоть даже 1) все должно быть случайно. Правда смутные сомнения терзают  поэтому решил взять 16 бит. По большому счету мне нужен рнд генератор в заданном диапазоне ( к примеру 0-23 , 0-75 , 0-300 и т.д.) Реализовать нужно на асме. Есть подпрограммы умножения 16b х 16b = 32b, и деление сделаю вычитанием. Хочу вот так сделать (поправте если ошибаюсь или перемудрил чего): 1. беру любые 16 бит XORSHIFTa 2. умножаю на 10000, получаю 32-х битное число. 3. делю это на 65536 (>>16) получаю случайное число в диапазоне 0 - 9999 4. умножаю на максимальное значение диапазона 5. делю это все на 10000
|
|
|
|
|
Sep 1 2011, 23:03
|
Участник
  
Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695

|
Цитата(zombi @ Sep 2 2011, 01:45)  По большому счету мне нужен рнд генератор в заданном диапазоне ( к примеру 0-23 , 0-75 , 0-300 и т.д.) ... 1. беру любые 16 бит XORSHIFTa 2. умножаю на 10000, получаю 32-х битное число. 3. делю это на 65536 (>>16) получаю случайное число в диапазоне 0 - 9999 4. умножаю на максимальное значение диапазона 5. делю это все на 10000 Можно проще и без деления: 1. беру любые 16 бит XORSHIFTa 4. умножаю на max+1 (max=максимальное значение диапазона ) 3. делю это на 65536 (>>16) получаю случайное число в диапазоне 0...max
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|