Детерминированные потоки случайного числа в C++ STL

Когда вы передаете Integer n методу triple, вы фактически передаете значение ссылки объекта Integer n.

Таким образом, в методе triple другая локальная переменная x указывает на эталонное значение this при вызове. Внутри метода, когда он умножает значение этого целочисленного объекта на 8, он создаст еще один новый экземпляр Integer как Integer является неизменным , для которого локальная переменная x будет указывать на.

Таким образом, вы не увидите это новое значение в операторе печати System.out.println("Hello world! " + n);, поскольку n все еще указывает на старый экземпляр Integer, который все еще 3.

Если вы попробуете это с StringBuilder, вы получите ожидаемый результат:

public static void main(String[] args) {
    StringBuilder n = new StringBuilder("foo");
    triple(n);
    System.out.println("Hello world! " + n);
}

public static void triple(StringBuilder s) {
    s.append("bar");
    System.out.println("Hello world! " + s);
}

Здесь результат будет:

Hello world! foobar
Hello world! foobar

Это потому, что [1116 ] является изменяемым , если triple изменяет данные, добавляя к ним, и исходный указатель n, и новый указатель s будут указывать на одно и то же значение ссылки на объект. [1128 ]

7
задан Matt J 16 March 2009 в 19:39
поделиться

7 ответов

srand() & rand() не часть STL. Они - на самом деле часть времени выполнения C. Да, они приведут к тем же результатам, пока это - та же реализация srand()/rand().

В зависимости от Ваших потребностей Вы могли бы хотеть рассмотреть использование Повышения. Случайный. Это обеспечивает несколько высококачественных генераторов случайных чисел.

5
ответ дан 6 December 2019 в 10:03
поделиться

Существуют десятки PRNGs, доступного как библиотеки. Выберите тот. Я склонен использовать вихрь Мерсенна.

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

MT является моим фаворитом, потому что я - физик, и я использую эти вещи для Монте-Карло, где гарантия равного распределения к высоким размерам важна. Но не используйте MT в качестве криптографического PRNG!

7
ответ дан 6 December 2019 в 10:03
поделиться

Принятие реализаций rand() то же, да.

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

4
ответ дан 6 December 2019 в 10:03
поделиться

Нет, ANSI C стандарт только указывает это rand() должен произвести поток случайных целых чисел между 0 и RAND_MAX, который должен быть по крайней мере 32 767 (источник). Этот поток должен быть детерминирован только в этом для данной реализации на данной машине, он должен произвести тот же целочисленный поток, учитывая то же семя.

Вы хотите портативный PRNG. Вихрь Мерсенна (много реализаций, связанных внизу), является довольно портативным, как C99-совместимый PRNG Ben Pfaff собственной разработки. Повышение. Случайный должен быть прекрасным также; поскольку Вы пишете свой код в C++, использование Повышения не ограничивает Ваш выбор платформ очень (хотя некоторые "меньшие" (т.е. несовместимый) компиляторы могут испытать затруднения из-за его интенсивного использования шаблонного метапрограммирования). Это - только действительно проблема для встроенных платформ низкого объема и возможно новой архитектуры исследования, поэтому если "любым компьютером" Вы имеете в виду "какую-либо x86/PPC/ARM/SPARC/Alpha/etc. платформу это цели GCC", любое вышеупомянутое должно сделать очень хорошо.

2
ответ дан 6 December 2019 в 10:03
поделиться

Запишите свою собственную стандартную программу псевдослучайного числа. Существует много алгоритмов, зарегистрированных в Интернете, и у них есть много приложений, где рэнд не достаточно хорош (например, Шум перлина).

Попробуйте эти ссылки за начинающих:

http://en.wikipedia.org/wiki/Linear_congruential_generator

http://en.wikipedia.org/wiki/Pseudorandom_number_generator

1
ответ дан 6 December 2019 в 10:03
поделиться

Я верю, предоставляете ли Вы srand с тем же семенем, Вы получите те же результаты. Это - в значительной степени определение семени с точки зрения генераторов псевдослучайных чисел.

0
ответ дан 6 December 2019 в 10:03
поделиться

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

0
ответ дан 6 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

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