реклама на сайте
подробности

 
 
> Xorshift ГПСЧ, есть вопросы
zombi
сообщение Aug 27 2011, 18:43
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 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-х байт) лучше использовать?

Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
ae_
сообщение Aug 28 2011, 09:57
Сообщение #2


Участник
***

Группа: Свой
Сообщений: 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 байт каждой переменной, м.б. в этих байтах шумит сильнее.
Go to the top of the page
 
+Quote Post
zombi
сообщение Aug 28 2011, 10:18
Сообщение #3


Гуру
******

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



Спасибо ae_

Цитата(ae_ @ Aug 28 2011, 12:57) *
Четыре 32-bit числа, сдвигаемые как одно целое, вместе составляют 128-bit число, в источнике указан период последовательности 2**128-1

Т.е. если взять 8-мь 32-х битных чисел то получим генератор с 2**256-1 последовательностью? и необходимо ли при этом менять количество и направление сдвигов?

Go to the top of the page
 
+Quote Post
ae_
сообщение Aug 28 2011, 10:27
Сообщение #4


Участник
***

Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695



Цитата(zombi @ Aug 28 2011, 19:18) *
Т.е. если взять 8-мь 32-х битных чисел то получим генератор с 2**256-1 последовательностью? и необходимо ли при этом менять количество и направление сдвигов?

Эти, с виду простые формулы, очень чувствительны к количеству и направлению сдвигов.
Можно взять вдвое больше переменных и, применив те же правила xor и сдвигов, получить даже меньший период повторения, чем у начальной формулы.
Как находят эти "магические" формулы - я не знаю.
Go to the top of the page
 
+Quote Post
zombi
сообщение Aug 28 2011, 10:31
Сообщение #5


Гуру
******

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



Цитата(ae_ @ Aug 28 2011, 13:27) *
Как находят эти "магические" формулы - я не знаю.

ОК. в таком случае остановлюсь пока на 128 битах rolleyes.gif
Go to the top of the page
 
+Quote Post
ae_
сообщение Aug 29 2011, 06:58
Сообщение #6


Участник
***

Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695



Google на запрос xorshift выдаёт второй строкой ссылку на публикацию автора алгоритма - George Marsaglia.
В статье есть варианты для последовательностей шириной 32;64;96;128,160 бит и 2**192-2**32 (практически 192 бит).
Go to the top of the page
 
+Quote Post
777777
сообщение Aug 30 2011, 09:15
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(zombi @ Aug 28 2011, 14:31) *
ОК. в таком случае остановлюсь пока на 128 битах rolleyes.gif

Я бы воспользовался функцией rand()
Go to the top of the page
 
+Quote Post
xemul
сообщение Aug 30 2011, 10:10
Сообщение #8



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(zombi @ Aug 27 2011, 22:43) *
3: результатом работы ГПСЧ есть 32-х битное число, а если мне достаточно одного байта то какой (из 4-х байт) лучше использовать?

Если Вам достаточно 2^8-1 последовательности, используйте 8-битный LFSR.
Go to the top of the page
 
+Quote Post
zombi
сообщение Sep 1 2011, 06:20
Сообщение #9


Гуру
******

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



Цитата(777777 @ Aug 30 2011, 12:15) *
Я бы воспользовался функцией rand()

Я срадостью бы, но нету у асма такой команды laughing.gif biggrin.gif

Цитата(xemul @ Aug 30 2011, 13:10) *
Если Вам достаточно 2^8-1 последовательности, используйте 8-битный LFSR.

маловат период!
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Sep 1 2011, 07:36
Сообщение #10


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Отмечу, что у xorshift великолепное распределение, что и подтверждается прохождением всех тестов на "случайность". Жаль, что на мелких 8-разрядных микроконтроллерах реализуется сложнее, чем LFSR. Зато результат того стоит...
Go to the top of the page
 
+Quote Post
zombi
сообщение Sep 1 2011, 08:27
Сообщение #11


Гуру
******

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



Цитата(rx3apf @ Sep 1 2011, 10:36) *
Отмечу, что у xorshift великолепное распределение, что и подтверждается прохождением всех тестов на "случайность". Жаль, что на мелких 8-разрядных микроконтроллерах реализуется сложнее, чем LFSR. Зато результат того стоит...

До этого момента сомневался делать или нет, но после Вашего "результат того стоит" точно попробую реализовать на 8-ми битном AVRе!
Кстати попутный вопрос : для достижения максимального периода повторения необходимо использовать все 4-ре байта в совокупности?
Go to the top of the page
 
+Quote Post
Dr.NoA
сообщение Sep 1 2011, 12:06
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 316
Регистрация: 22-10-05
Пользователь №: 9 976



Что-то я не пойму следующее. Если автору темы требуются 8-битные случайные числа, то чем не устраивает 8-битный генератор с периодом 2^8-1? Какой смысл тратить ресурсы на 32-разрядный генератор, а потом брать только 8 бит, если все равно выходные значения в лучшем случае будут иметь период 2^8-1 (при этом еще большой вопрос на счет периода и свойств распределения этого выходного байта)?
Go to the top of the page
 
+Quote Post
ae_
сообщение Sep 1 2011, 12:34
Сообщение #13


Участник
***

Группа: Свой
Сообщений: 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 это для байтовой переменной - уже хорошо.
Но не период = размерности переменной, это очень, очень заметно.
Go to the top of the page
 
+Quote Post
zombi
сообщение Sep 1 2011, 16:45
Сообщение #14


Гуру
******

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



Цитата(Dr.NoA @ Sep 1 2011, 15:06) *
Что-то я не пойму следующее. Если автору темы требуются 8-битные случайные числа, то чем не устраивает 8-битный генератор с периодом 2^8-1?

Т.е. через 255 шагов можно точно предсказать следующее значение rnd biggrin.gif это абсолютно не приемлемо для меня.

Цитата(Dr.NoA @ Sep 1 2011, 15:06) *
Какой смысл тратить ресурсы на 32-разрядный генератор, а потом брать только 8 бит, если все равно выходные значения в лучшем случае будут иметь период 2^8-1

ошибаетесь

Цитата(Dr.NoA @ Sep 1 2011, 15:06) *
(при этом еще большой вопрос на счет периода и свойств распределения этого выходного байта)?

Если тесты на "случайность" одобряют этот алгоритм значит состояние любого бита тоже случайно и думаю что сколько бы бит из 32-х не взять (хоть даже 1) все должно быть случайно.
Правда смутные сомнения терзают biggrin.gif поэтому решил взять 16 бит.


По большому счету мне нужен рнд генератор в заданном диапазоне ( к примеру 0-23 , 0-75 , 0-300 и т.д.)
Реализовать нужно на асме.
Есть подпрограммы умножения 16b х 16b = 32b, и деление сделаю вычитанием.
Хочу вот так сделать (поправте если ошибаюсь или перемудрил чего):

1. беру любые 16 бит XORSHIFTa
2. умножаю на 10000, получаю 32-х битное число.
3. делю это на 65536 (>>16) получаю случайное число в диапазоне 0 - 9999
4. умножаю на максимальное значение диапазона
5. делю это все на 10000
Go to the top of the page
 
+Quote Post
ae_
сообщение Sep 1 2011, 23:03
Сообщение #15


Участник
***

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 19:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.01515 секунд с 7
ELECTRONIX ©2004-2016