Синхронизация генератора случайных чисел
От: DaDa Cloun Россия  
Дата: 29.09.09 14:36
Оценка:
Господа!
Подскажет пожалуйста, как можно решить следующую задачу:
есть генератор величин
var random = new Random(startingPoint);

затем происходит некоторые вычисления, в следствие которых из последовательности выбираются некоторые случайные велечины
for (int i = 0; i < X; ++i)
{
  random.Next();
}

и вот в этот момент мне нужно породить такой же генератор случайных чисел
var random2 = random.Clone();
bool isTrue = random.Next() == random2.Next();

так что бы isTrue было истинно.
Я так понял, что используя стандартный генератор этого добиться не возможно? Существуют ли реализации, которые позволили бы подобное?
Спасибо.
random
Re: Синхронизация генератора случайных чисел
От: Mr.Cat  
Дата: 29.09.09 14:42
Оценка:
Точно не помню, но полюркай в msdn свойство с названием seed или что-то подобное.
Re[2]: Синхронизация генератора случайных чисел
От: DaDa Cloun Россия  
Дата: 29.09.09 14:56
Оценка:
Здравствуйте, Mr.Cat, Вы писали:

MC>Точно не помню, но полюркай в msdn свойство с названием seed или что-то подобное.


Нашел RNGCryptoServiceProvider, но у него даже начального значения нет...
Re[3]: Синхронизация генератора случайных чисел
От: Mr.Cat  
Дата: 29.09.09 14:59
Оценка:
http://msdn.microsoft.com/en-us/library/ctssatww.aspx
Re[4]: Синхронизация генератора случайных чисел
От: DaDa Cloun Россия  
Дата: 29.09.09 15:08
Оценка:
Здравствуйте, Mr.Cat, Вы писали:

MC>http://msdn.microsoft.com/en-us/library/ctssatww.aspx


Любопытно, но все же очень хотелось бы получить ответ на мой вопрос... В любом случае спасибо за попытку.
Re[5]: Синхронизация генератора случайных чисел
От: Mr.Cat  
Дата: 29.09.09 15:19
Оценка: 5 (1)
Здравствуйте, DaDa Cloun, Вы писали:
DC>Любопытно, но все же очень хотелось бы получить ответ на мой вопрос... В любом случае спасибо за попытку.
Прошу прощения. Невнимательно прочитал вопрос.
Да, с Random вроде бы так нельзя. Но можно просто сделать 2 новых Random и исходный Random заменить на один из созданных.
Re: Синхронизация генератора случайных чисел
От: vasilov  
Дата: 29.09.09 17:11
Оценка:
Здравствуйте, DaDa Cloun, Вы писали:

А завести 2 рандома сразу с одним startingPoint и одновременно делать Next?
DC>for (int i = 0; i < X; ++i)
DC>{
DC>  random1.Next();
     random2.Next();
DC>}

Просто предположение, что должны синхронны быть. Непроверенное.
... << RSDN@Home 1.2.0 alpha 4 rev. 1139>>
Re: Синхронизация генератора случайных чисел
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 29.09.09 19:11
Оценка: +1 -1
Здравствуйте, DaDa Cloun, Вы писали:

DC>Я так понял, что используя стандартный генератор этого добиться не возможно?


var rnd1 = new Random(123);
var rnd2 = new Random(123);
for (var i = 1; i < 10; i++)
    Console.WriteLine("{0} {1}", rnd1.Next(), rnd2.Next());


А вообще стоит переделать код с явного использования Random на использование IEnumerable<int>.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237 on Windows 7 6.1.7100.0>>
AVK Blog
Re[2]: Синхронизация генератора случайных чисел
От: koandrew Канада http://thingselectronic.blogspot.ca/
Дата: 29.09.09 23:05
Оценка:
Здравствуйте, vasilov, Вы писали:

V>Просто предположение, что должны синхронны быть. Непроверенное.


Они будут синхронны.

Pseudo-random numbers are chosen with equal probability from a finite set of numbers. The chosen numbers are not completely random because a definite mathematical algorithm is used to select them, but they are sufficiently random for practical purposes. The current implementation of the Random class is based on Donald E. Knuth's subtractive random number generator algorithm. For more information, see D. E. Knuth. "The Art of Computer Programming, volume 2: Seminumerical Algorithms". Addison-Wesley, Reading, MA, second edition, 1981.

The random number generation starts from a seed value. If the same seed is used repeatedly, the same series of numbers is generated. One way to produce different sequences is to make the seed value time-dependent, thereby producing a different series with each new instance of Random.

http://msdn.microsoft.com/en-us/library/system.random.aspx

Более того, на всех платформах и языках, на которых мне доводилось работать, ГПСЧ работает идентично и при одинаковых seed'ах генерирует одинаковые последовательности. Этот факт часто используется для систем аутентификации, т.к. позволяет избавиться от передачи пароля через сеть...
[КУ] оккупировала армия.
Re[2]: Синхронизация генератора случайных чисел
От: Sinix  
Дата: 30.09.09 03:13
Оценка:
Здравствуйте, AndrewVK:

AVK>А вообще стоит переделать код с явного использования Random на использование IEnumerable<int>.


Ну грабли никуда не уйдут
http://bartdesmet.net/blogs/bart/archive/2009/09/12/taming-your-sequence-s-side-effects-through-ienumerable-let.aspx
Re[3]: Синхронизация генератора случайных чисел
От: Мизантроп  
Дата: 30.09.09 03:28
Оценка: :)
Здравствуйте, koandrew, Вы писали:

K>Более того, на всех платформах и языках, на которых мне доводилось работать, ГПСЧ работает идентично и при одинаковых seed'ах генерирует одинаковые последовательности. Этот факт часто используется для систем аутентификации, т.к. позволяет избавиться от передачи пароля через сеть...


Боюсь, вы несколько погорячились. Реализаций ГСПЧ существует множество, и генераторы с линейным распределением — только лишь частный случай. Я вот прямо сейчас запустил три генератора — NET, нативный Си и дельфи, с одинаковым seed (1000) и диапазоном(0..32767), и получил три разные последовательности. Использование же ГСПЧ в криптографии основано на использовании обоими сторонами одного алгоритма генерации с одинаковым набором коэффициентов.
"Нормальные герои всегда идут в обход!"
Re[2]: Синхронизация генератора случайных чисел
От: DaDa Cloun Россия  
Дата: 30.09.09 07:18
Оценка:
Здравствуйте, vasilov, Вы писали:

V>А завести 2 рандома сразу с одним startingPoint и одновременно делать Next?

for (int i = 0; i < X; ++i)
{
  random1.Next();
 random2.Next();
}


Нет, к сожалению так не возможно. На самом деле представьте, что после Х итераций мне надо запустить два процесса с одинаковым random. Но Х — неизвестная величина, либо очень большая, так что "докручивать" генератор начиная с seed до Х — затратно.

V>Просто предположение, что должны синхронны быть. Непроверенное.


Верное, если алгоритм генерации един.
Re: Синхронизация генератора случайных чисел
От: DaDa Cloun Россия  
Дата: 30.09.09 07:24
Оценка: +1
На данный момент я нашел следующее "решение" — сделал свою реализацию генератора, используя этот алгоритм. Кроме синхронизации мне еще нужна кроссплатформенность (вернее тот же алгоритм на различных языках). Поэтому данное решение наиболее удобное для меня.
Re[4]: Синхронизация генератора случайных чисел
От: _FRED_ Черногория
Дата: 30.09.09 07:31
Оценка:
Здравствуйте, Мизантроп, Вы писали:

K>>Более того, на всех платформах и языках, на которых мне доводилось работать, ГПСЧ работает идентично и при одинаковых seed'ах генерирует одинаковые последовательности. Этот факт часто используется для систем аутентификации, т.к. позволяет избавиться от передачи пароля через сеть...


М>Боюсь, вы несколько погорячились. Реализаций ГСПЧ существует множество, и генераторы с линейным распределением — только лишь частный случай. Я вот прямо сейчас запустил три генератора — NET, нативный Си и дельфи, с одинаковым seed (1000) и диапазоном(0..32767), и получил три разные последовательности.


Ещё бы Ты же запускал разные генеаторы (с разной реализацией) а суть-то одна — если запустишь второй раз тот же генератор с тем же сидом, получишь тот же результат. Если генеретор не какой-то особенный, коих (особенных) подавляющее меньшинство.
Help will always be given at Hogwarts to those who ask for it.
Re: Синхронизация генератора случайных чисел
От: Pavel Dvorkin Россия  
Дата: 30.09.09 07:37
Оценка: 1 (1) +1
Здравствуйте, DaDa Cloun, Вы писали:

DC>[/c#]

DC>и вот в этот момент мне нужно породить такой же генератор случайных чисел
DC>
DC>var random2 = random.Clone();
DC>bool isTrue = random.Next() == random2.Next();
DC>

DC>так что бы isTrue было истинно.

Не совсем понятно, зачем этого добиваться. Почему бы просто не бросить первый генератор на произвол судьбы и на закуску GC и завести два новых в этот момент, с одним и тем же startingPoint ?
With best regards
Pavel Dvorkin
Re[3]: Синхронизация генератора случайных чисел
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 30.09.09 09:53
Оценка: +1
Здравствуйте, Sinix, Вы писали:

S>Ну грабли никуда не уйдут

S>http://bartdesmet.net/blogs/bart/archive/2009/09/12/taming-your-sequence-s-side-effects-through-ienumerable-let.aspx

Уйдут грабли, связанные с завязкой кода на конкретную реализацию rnd. А другого я и не обещал
... << RSDN@Home 1.2.0 alpha 4 rev. 1237 on Windows 7 6.1.7100.0>>
AVK Blog
Re[5]: Синхронизация генератора случайных чисел
От: Мизантроп  
Дата: 30.09.09 10:38
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, Мизантроп, Вы писали:


K>>>Более того, на всех платформах и языках, на которых мне доводилось работать, ГПСЧ работает идентично и при одинаковых seed'ах генерирует одинаковые последовательности. Этот факт часто используется для систем аутентификации, т.к. позволяет избавиться от передачи пароля через сеть...


М>>Боюсь, вы несколько погорячились. Реализаций ГСПЧ существует множество, и генераторы с линейным распределением — только лишь частный случай. Я вот прямо сейчас запустил три генератора — NET, нативный Си и дельфи, с одинаковым seed (1000) и диапазоном(0..32767), и получил три разные последовательности.


_FR>Ещё бы Ты же запускал разные генеаторы (с разной реализацией) а суть-то одна — если запустишь второй раз тот же генератор с тем же сидом, получишь тот же результат. Если генеретор не какой-то особенный, коих (особенных) подавляющее меньшинство.


Мне кажется, Вы как-то неправильно меня поняли
Ведь как раз об этом я и говорил: алгоритмов генерации множество, реализации в базовых библиотеках разных языков могут использовать разные алгоритмы и/или наборы коэффициентов, поэтому совпадения генерируемых рядов, о котором говорил koandrew, в реальности не наблюдается. Дело конечно не в том, что реализации разные, а в том, что эти генераторы используют разные наборы коэффициентов или разные алгоритмы.

А мне казалось, что я достаточно определённо высказался На всякий случай, я специально выделил высказывание, на которое приводил возражение.
"Нормальные герои всегда идут в обход!"
Re[6]: Синхронизация генератора случайных чисел
От: _FRED_ Черногория
Дата: 30.09.09 11:48
Оценка:
Здравствуйте, Мизантроп, Вы писали:

K>>>>Более того, на всех платформах и языках, на которых мне доводилось работать, ГПСЧ работает идентично и при одинаковых seed'ах генерирует одинаковые последовательности. Этот факт часто используется для систем аутентификации, т.к. позволяет избавиться от передачи пароля через сеть...


М>>>Боюсь, вы несколько погорячились. Реализаций ГСПЧ существует множество, и генераторы с линейным распределением — только лишь частный случай. Я вот прямо сейчас запустил три генератора — NET, нативный Си и дельфи, с одинаковым seed (1000) и диапазоном(0..32767), и получил три разные последовательности.


_FR>>Ещё бы Ты же запускал разные генеаторы (с разной реализацией) а суть-то одна — если запустишь второй раз тот же генератор с тем же сидом, получишь тот же результат. Если генеретор не какой-то особенный, коих (особенных) подавляющее меньшинство.


М>Мне кажется, Вы как-то неправильно меня поняли

М>Ведь как раз об этом я и говорил: алгоритмов генерации множество, реализации в базовых библиотеках разных языков могут использовать разные алгоритмы и/или наборы коэффициентов, поэтому совпадения генерируемых рядов, о котором говорил koandrew, в реальности не наблюдается.

То, что не наблюдается совпадений, вовсе не говорит о том, что применяются различные алгоритмы — просто напросто в разных реализациях могут использоваться разные константы и разные "magic numbers".

М>Дело конечно не в том, что реализации разные, а в том, что эти генераторы используют разные наборы коэффициентов или разные алгоритмы.


Вот-вот. Делать вывод об одинаковости или разности алгоритмов на основании результата работы очень поспешно.

koandrew здесь
Автор: koandrew
Дата: 30.09.09
говорил всего лишь, что

…ГПСЧ работает идентично и при одинаковых seed'ах генерирует одинаковые последовательности.


"идентично" не означает, что используется один и тот же алгоритм, а лишь о том, что работают эти алгоритмы "одинаково". И одинаковость определяется тем, что при одном и тот же seed-e алгоритм будет возвращать одинаковые последовательности.

М>А мне казалось, что я достаточно определённо высказался На всякий случай, я специально выделил высказывание, на которое приводил возражение.


Совершённо определённо, только неверно. "идентичность" не подразумевает один и тот же алгоритм с совершенно одинаковой реализацией, а подразумевает не более того, что было заявлено: "при одинаковых seed'ах генерирует одинаковые последовательности" — один и тот же генератор, а не разные.
Help will always be given at Hogwarts to those who ask for it.
Re[7]: Синхронизация генератора случайных чисел
От: Мизантроп  
Дата: 30.09.09 12:19
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>То, что не наблюдается совпадений, вовсе не говорит о том, что применяются различные алгоритмы — просто напросто в разных реализациях могут использоваться разные константы и разные "magic numbers".


То есть, иначе говоря, разные коэффициенты для реализуемых функций. Разве я не то-же самое говорил?

М>>Дело конечно не в том, что реализации разные, а в том, что эти генераторы используют разные наборы коэффициентов или разные алгоритмы.


_FR>Вот-вот. Делать вывод об одинаковости или разности алгоритмов на основании результата работы очень поспешно.


_FR>koandrew здесь
Автор: koandrew
Дата: 30.09.09
говорил всего лишь, что

_FR>

…ГПСЧ работает идентично и при одинаковых seed'ах генерирует одинаковые последовательности.


_FR>"идентично" не означает, что используется один и тот же алгоритм, а лишь о том, что работают эти алгоритмы "одинаково". И одинаковость определяется тем, что при одном и тот же seed-e алгоритм будет возвращать одинаковые последовательности.


М>>А мне казалось, что я достаточно определённо высказался На всякий случай, я специально выделил высказывание, на которое приводил возражение.


_FR>Совершённо определённо, только неверно. "идентичность" не подразумевает один и тот же алгоритм с совершенно одинаковой реализацией, а подразумевает не более того, что было заявлено: "при одинаковых seed'ах генерирует одинаковые последовательности" — один и тот же генератор, а не разные.


Возможно, я не слишком удачно выразился, поставив знак равенства между "реализуемой функцией" и алгоритмом, хотя мне казалость, что в данном случае это очевидно. Но тогда объясните, что означало

на всех платформах и языках ... ГПСЧ работает идентично и при одинаковых seed'ах генерирует одинаковые последовательности"

О каком одном и том-же генераторе идёт речь, когда эти самые генераторы реализованы в базовых библиотеках этих самых языков, и по факту лежащие в их основе фунции/коэффициенты различны? А тем более, когда речь идёт о разных платформах. Может Вы приведёте пример языка, встроенный генератор которого выдаёт ту-же последовательность, что и, скажем, rand в Си?

Или может просто объясните, о каких генераторах, реально существующих, шла речь в процитированной фразе? И что означало "на всех платформах и языках"?
"Нормальные герои всегда идут в обход!"
Re[7]: Синхронизация генератора случайных чисел
От: Мизантроп  
Дата: 30.09.09 12:33
Оценка:
Здравствуйте, _FRED_, Вы писали:

М>>Дело конечно не в том, что реализации разные, а в том, что эти генераторы используют разные наборы коэффициентов или разные алгоритмы.


_FR>Вот-вот. Делать вывод об одинаковости или разности алгоритмов на основании результата работы очень поспешно.


Пардон, что значит "вот-вот"? Это ведь Вы о каком-то одном и том-же генераторе говорили, а вовсе не я. Я говорил, и продолжаю утверждать: Ни о какой одинаковости для разных языков и платформ речи идти не может потому, что во множестве языков используются "встроенные" генераторы, и они отличаются либо реализуемой функцией. либо набором коэффициентов. В случае же различных платформ это определяется наличием/отсутствием реализации конкретной функции с конкретным набором коэффициентов для данной конкретной платформы. Что и имеет место в случае криптографических генераторов. Но тогда о каком-то различии языков вообще не имеет смысла говорить, ибо из любого языка вызывается одна и та-же реализация.
"Нормальные герои всегда идут в обход!"
Re[2]: Синхронизация генератора случайных чисел
От: DaDa Cloun Россия  
Дата: 30.09.09 12:36
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Не совсем понятно, зачем этого добиваться. Почему бы просто не бросить первый генератор на произвол судьбы и на закуску GC и завести два новых в этот момент, с одним и тем же startingPoint ?


Проблема в том что очень сложно описать суть задачи. Можно процесс вычисления состояния некоторого объекта представить как ствол дерева. В какие-то моменты времени возникает необходимость начать параллельное вычисление состояний с тем же генератором, но что-то в состояние объекта изменилось в результате внешнего воздействия. Вот в этих узлах мне необходимо сделать копию генератора, что бы начать параллельно вычисление. Причем два таких "дерева" растет параллельно в различных процессах (клиент и сервер).

Так теперь, почему же ваше предложение мне не подходит. Что мне брать в качестве этих startingPoint в те моменты времени, когда процесс надо разветвить? И как эти startingPoint синхронизировать?
Re[2]: Синхронизация генератора случайных чисел
От: Мизантроп  
Дата: 01.10.09 02:04
Оценка:
Здравствуйте, DaDa Cloun, Вы писали:

DC>На данный момент я нашел следующее "решение" — сделал свою реализацию генератора, используя этот алгоритм. Кроме синхронизации мне еще нужна кроссплатформенность (вернее тот же алгоритм на различных языках). Поэтому данное решение наиболее удобное для меня.


Вы напрасно взяли слово "решение" в кавычки. При Ваших требованиях это один из двух возможных вариантов. Второй — оформление генератора в библиотеке, которая будет использована из других языков, при этом Вам необходимо будет предоставить прямой доступ на чтение и запись к промежуточеному состоянию генератора, а это накладывает ограничения на вобор языка для реализации такой библиотеки, потому как далеко не во всех такой доступ предоставляется.
"Нормальные герои всегда идут в обход!"
Re[3]: Синхронизация генератора случайных чисел
От: Мизантроп  
Дата: 01.10.09 02:19
Оценка:
Здравствуйте, DaDa Cloun, Вы писали:

DC>Здравствуйте, Pavel Dvorkin, Вы писали:


PD>>Не совсем понятно, зачем этого добиваться. Почему бы просто не бросить первый генератор на произвол судьбы и на закуску GC и завести два новых в этот момент, с одним и тем же startingPoint ?


DC>Проблема в том что очень сложно описать суть задачи. Можно процесс вычисления состояния некоторого объекта представить как ствол дерева. В какие-то моменты времени возникает необходимость начать параллельное вычисление состояний с тем же генератором, но что-то в состояние объекта изменилось в результате внешнего воздействия. Вот в этих узлах мне необходимо сделать копию генератора, что бы начать параллельно вычисление. Причем два таких "дерева" растет параллельно в различных процессах (клиент и сервер).


DC>Так теперь, почему же ваше предложение мне не подходит. Что мне брать в качестве этих startingPoint в те моменты времени, когда процесс надо разветвить?


Например, последнее возвращенное вызовом Next значение.

DC>И как эти startingPoint синхронизировать?


Ну Вы же как-то собирались передавать копию генератора, тем-же способом и startingPoint можно передать. Но Ваше требование "для разных языков" сводит эти рассуждения в разряд отвлечённых. Вам потребуется внешняя библиотека, которая могла-бы быть использована из разных языков.
"Нормальные герои всегда идут в обход!"
Re[4]: Синхронизация генератора случайных чисел
От: midcyber
Дата: 01.10.09 08:38
Оценка:
Здравствуйте, Мизантроп, Вы писали:

DC>>Так теперь, почему же ваше предложение мне не подходит. Что мне брать в качестве этих startingPoint в те моменты времени, когда процесс надо разветвить?


М>Например, последнее возвращенное вызовом Next значение.


Этого делать с PRNG нельзя — будет плохо распределению.
На левой картинке — распределение для одного Random — 100 миллионов вызовов rnd.Next(65536)
На правой — каждые 10000 сбрасывался генератор rnd = new Random(rnd.Next(65536));

Re[5]: Синхронизация генератора случайных чисел
От: Ziaw Россия  
Дата: 01.10.09 08:49
Оценка:
Здравствуйте, midcyber, Вы писали:

M>Этого делать с PRNG нельзя — будет плохо распределению.

M>На левой картинке — распределение для одного Random — 100 миллионов вызовов rnd.Next(65536)
M>На правой — каждые 10000 сбрасывался генератор rnd = new Random(rnd.Next(65536));
M>

У меня ощущение, что эксперимент неудачный, можно увидеть код?
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Re[6]: Синхронизация генератора случайных чисел
От: midcyber
Дата: 01.10.09 09:57
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>У меня ощущение, что эксперимент неудачный, можно увидеть код?


Да, Вы оказались правы, у меня была ошибка. Заменил картинку
Re[5]: Синхронизация генератора случайных чисел
От: Мизантроп  
Дата: 01.10.09 10:10
Оценка:
Здравствуйте, midcyber, Вы писали:

M>Ошибочка закралась.


Тем не менее, я тоже думаю, что способ не очень Самописная реализация просто напрашивается, благо сложнностей оно не представляет, а в сети навалом как описаний алгоритмов, так и примеров кода.
"Нормальные герои всегда идут в обход!"
Re[4]: Синхронизация генератора случайных чисел
От: DaDa Cloun Россия  
Дата: 06.10.09 06:43
Оценка:
Здравствуйте, Мизантроп, Вы писали:

DC>>Так теперь, почему же ваше предложение мне не подходит. Что мне брать в качестве этих startingPoint в те моменты времени, когда процесс надо разветвить?

М>Например, последнее возвращенное вызовом Next значение.

Я боюсь что это плохо повлияет на само распределение

DC>>И как эти startingPoint синхронизировать?

М>Ну Вы же как-то собирались передавать копию генератора, тем-же способом и startingPoint можно передать. Но Ваше требование "для разных языков" сводит эти рассуждения в разряд отвлечённых. Вам потребуется внешняя библиотека, которая могла-бы быть использована из разных языков.

Согласен. Но на самом деле реализация "своего" генератора достаточно тривиальная задача, поэтому проще реализовать тот же алгоритм на других языках. Так что в результате я полностью удовлетворился своим изначальным решением.
Re[6]: Синхронизация генератора случайных чисел
От: DaDa Cloun Россия  
Дата: 06.10.09 06:44
Оценка:
Здравствуйте, Мизантроп, Вы писали:

М>Тем не менее, я тоже думаю, что способ не очень Самописная реализация просто напрашивается, благо сложнностей оно не представляет, а в сети навалом как описаний алгоритмов, так и примеров кода.


Да, именно так все и оказалось. Спасибо всем за ответы.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.