2017-02-06 3 views
-1

У меня есть код, когда я запускаю визуальную студию, у меня разные результаты, и когда я запускаю с использованием компилятора g ++, я получаю разные результаты. У этого есть семя 1, поэтому я предполагаю, что это не должно повлиять на него. Также есть некоторые части кода, которые работают в потоке (но эта часть не содержит никакой функции rand)Выполняет ли код C++ в разных компиляторах разные результаты

Получаем те же результаты по запуск приложения на той же платформе, но другой, если я использую разные компиляторы

+0

Возможно, http://stackoverflow.com/questions/3958795/different-rand-results-on-windows-and-linux? –

+1

Если у вас есть неопределенное поведение, вы можете получить то, что вы описали. Вы также можете получить разные результаты в разных записях с одним и тем же компилятором. – NathanOliver

+0

[Посмотрите здесь] (http://stackoverflow.com/questions/7209094/why-can-different-c-compilers-give-different-outputs-for-a-c-program). Это зависит от вашего кода, поэтому его трудно сказать без кода/примера. – izlin

ответ

5

Для всех действий, которые определяет стандарт, программы, созданные всеми компиляторами, должны вести себя одинаково.

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

Кроме того, компиляторы обычно не всегда соответствуют стандарту во всех случаях, а некоторые компиляторы могут не поддерживать такую ​​же версию стандарта, как и другие.

И, наконец, некоторые стандартные правила считаются неоднозначными, и разные компиляторы могут выбрать противоположную интерпретацию. Они должны быть задокументированы как defect reports.

.. семян ... функция Rand ...

случайная последовательность производства rand определяется реализацией. Да, результаты могут отличаться от разных компиляторов.


C++ 11 введен <random> заголовок. Из генераторов случайных чисел, определенных там, default_random_engine является единственным, у которого есть поведение, определенное реализацией.

+0

_ «Для всех действий, которые определяет стандарт, все компиляторы должны вести себя одинаково». Хотя это правильно, это не значит, что они всегда это делают. Действительно, довольно много вопросов о SO идентифицируют программы, которые разные компиляторы трактуют по-разному, либо из-за расширений, либо из-за ошибок. Не говоря уже о разных стандартных версиях. –

+0

@LightnessRacesinOrbit Я отредактировал оговорки в вопросе. Большинство языковых расширений извлекают выгоду из того факта, что стандарт не указывает никакого поведения для плохо сформированных программ. – user2079303

+0

Это на самом деле не так, если фраза «никакой диагностической необходимости» не включена после объявления о недобросовестности. В противном случае требуется диагностика. –

3

Если вы хотите воспроизводимые псевдослучайные числа, вместо этого используйте C++ facilities, чтобы вы могли выбрать четко определенный генератор.

Генератор псевдослучайных чисел C не может быть одинаковым для всех компиляторов или платформ.

-1

Генерация псевдослучайных чисел - очень сложная проблема. Лучше использовать стороннюю библиотеку. Например, существует несколько генераторов случайных чисел, включенных в Научную библиотеку GNU (https://www.gnu.org/software/gsl/). Когда мне нужен воспроизводимый генератор случайных чисел, я стараюсь использовать Mersenne Twister, который является стандартом GSL.

Генерация случайных чисел для криптографии выполняется с другими библиотеками.

Также вы можете проверить quailty из вашего генератора, используя Die Harder II (https://www.phy.duke.edu/~rgb/General/dieharder.php). И да, технически вы не можете сказать, насколько случайным является что-то, но если вы можете найти шаблон в нем - это определенно не случайный.

+1

Вам не нужна сторонняя библиотека для получения воспроизводимых случайных чисел. У C++ была мощная библиотека генерации случайных чисел с C++ 11. –