2017-02-06 9 views
-1

Visual Studioで実行するとコードが変わってしまい、結果が異なり、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

それは実際には真実ではありませんが、 "no diagnostic required"というフレーズが不合理宣言の後に含まれている場合を除きます。それ以外の場合は診断が必要です。 –

3

再現可能な擬似乱数が必要な場合は、代わりにC++ facilitiesを使用して、明確に定義されたジェネレータを選択できます。

C擬似乱数ジェネレータは、コンパイラまたはプラットフォーム間で同じであることは保証されていません。

-1

擬似乱数生成は非常に難しい問題です。サードパーティのライブラリを使用する方がよいでしょう。たとえば、GNU科学ライブラリ(https://www.gnu.org/software/gsl/)に含まれているいくつかの乱数ジェネレータがあります。再現可能な乱数ジェネレータが必要なときは、GSLデフォルトであるメルセンヌツイスターを使う傾向があります。

暗号化の乱数生成は他のライブラリで行われます。

また、Die Harder II(https://www.phy.duke.edu/~rgb/General/dieharder.php)を使用している発電機の不安定さをテストできます。そして、はい、技術的には、ランダムなものがどれほどあるかを知ることはできませんが、パターンを見つけることができれば、それは間違いなくランダムです。

+1

再現可能な乱数を取得するためにサードパーティのライブラリは必要ありません。 C++には、C++ 11以降の強力な乱数生成ライブラリがありました。 –

関連する問題