Воспроизводить случайные числа в C #, повторно используя одно и то же начальное начальное значение в разных архитектурах? [Дубликат]

Хотя в вашем примере int(input(...)) делает трюк в любом случае, python-future 's builtins.input заслуживает внимания, поскольку это гарантирует, что ваш код работает как для Python 2, так и для 3 и отключает поведение Python2 по умолчанию input, пытающееся быть «умным» относительно типа входных данных (builtins.input в основном ведет себя как raw_input).

9
задан svick 28 July 2014 в 10:47
поделиться

4 ответа

Я ожидал бы, что любая одна реализация даст одну и ту же последовательность для одного и того же семени, но могут быть различные реализации. Например, «онлайн-компилятор C #» может в конечном итоге использовать Mono, и я ожидаю, что у него будет другая реализация в .NET.

Я не знаю, изменились ли реализации между версиями .NET, но опять же это кажется вполне возможным.

Документация для конструктора Random(int) гласит:

< blockquote>

Предоставление одинакового значения семени различным объектам Random приводит к тому, что каждый экземпляр создает идентичные последовательности случайных чисел.

... но в нем не указаны значения различных версий и т. д. Черт, он даже не указывает, будут ли версии x86 и x64 давать одинаковые результаты. Я ожидал бы те же результаты в любом конкретном экземпляре CLR (т. Е. Один процесс, а не два CLR, работающих бок о бок, либо *.

Если вам что-то нужно более стабильный, я бы начал с алгоритма , указанного - я уверен, что доступны версии Mersenne Twister и т. д.

14
ответ дан Jon Skeet 22 August 2018 в 07:07
поделиться
  • 1
    возможно, из-за разных версий visual studio, я использую 2010 профессионал, но я думаю, что пример кода использует 2010 express – Ivan Li 31 August 2012 в 12:49
  • 2
    @IvanLi: Нет, это не изменит ситуацию. Таргетирование на различные версии фреймворка вполне может быть выполнено. – Jon Skeet 31 August 2012 в 12:57

Возможно, это связано с различными версиями рамок. Посмотрите на этот

1
ответ дан Community 22 August 2018 в 07:07
поделиться

Это не указано в качестве такого обещания, поэтому вы должны предположить, что это не так.

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

Действительно, в документации Random говорится:

Текущая реализация класса Random основана на Donald E Алгоритм генератора случайных чисел Кнута.

Обратите внимание на фразу «текущая реализация», подразумевая, что она может измениться в будущем. Это очень убедительно свидетельствует о том, что не существует обещания быть совместимым между версиями, но нет никакого намерения.

Если спецификация требует последовательных псевдослучайных чисел, то она также должна указать алгоритм как начальное значение. Действительно, даже если Random был задан как предоставление такого обещания, что, если вам понадобится реализация не-.NET всей или части вашей спецификации или что-то, что взаимодействует с ней, в будущем?

7
ответ дан Jon Hanna 22 August 2018 в 07:07
поделиться
  • 1
    Он является указанным как обещание некоторой степени ... это просто не очень хорошо указано: & quot; Предоставление одинакового значения семени различным объектам Random приводит к тому, что каждый экземпляр производят идентичные последовательности случайных чисел. & quot; - к сожалению, это ничего не говорит о стабильности в разных версиях :( – Jon Skeet 31 August 2012 в 12:37
  • 2
    @JonSkeet Это единственное обещание, о котором я говорил. – Jon Hanna 31 August 2012 в 12:38

Интернет-провайдер, которого вы пытались, может использовать реализацию Mono CLR, которая отличается от той, которую предоставляет Microsoft. Поэтому, вероятно, их реализация класса Random немного отличается.

0
ответ дан ken2k 22 August 2018 в 07:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: