15

私は現在、乱数発生器で立ち往生しています。要件仕様は、次のようなサンプルを示しています。

Random rand = new Random(3412);

rand の結果は直接出されるのではなく、他のパフォーマンスに使用されます。

上記と同じコードをシード 3412 で乱数を生成するコードを書きました。ただし、残りのパフォーマンスの結果は、サンプルによってまったく異なります。

生成結果は 518435373 で、オンラインの C# コンパイラで試した同じコードを使用しましたが、異なる生成結果 11688046 が得られ、残りのパフォーマンス結果もサンプルとは異なりました。

だから、それはマシンによって異なるはずなのだろうかと思っています。

ところで、誰かがあなたのマシンからの結果を提供できますか?それが私と同じかどうかを確認してください.

4

4 に答える 4

17

いずれかの実装が同じシードに対して同じシーケンスを提供することを期待しますが、異なる実装が関係している可能性があります。たとえば、「オンラインC#コンパイラ」は、Monoを使用することになる可能性があります。これは、.NETの実装とは異なる実装になると思います。

.NETのバージョン間で実装が変更されたかどうかはわかりませんが、繰り返しになりますが、それは完全に可能のようです。

Random(int)コンストラクターのドキュメントには次のように記載されています。

異なるランダムオブジェクトに同一のシード値を提供すると、各インスタンスは同一の乱数シーケンスを生成します。

...しかし、異なるバージョンなどの影響については指定していません。ちなみに、x86バージョンとx64バージョンで同じ結果が得られるかどうかについても述べていません。1つの特定のCLRインスタンス内でも同じ結果が得られると思います(つまり、1つのプロセスであり、2つのCLRが並行して実行されることもありません*。

より安定したものが必要な場合は、指定されたアルゴリズムから始めます。メルセンヌツイスターなどの実装が利用できると思います。

于 2012-08-31T11:34:56.013 に答える
9

そのような約束をするように指定されていないので、そうではないと仮定する必要があります。

仕様に関する良いルールは、合理的な使用に必要のない約束をしないことです。これにより、後で物事をより自由に改善できます。

確かに、Randomのドキュメントには次のように書かれています。

Random クラスの現在の実装は、Donald E. Knuth の減算乱数ジェネレーター アルゴリズムに基づいています。

「現在の実装」というフレーズに注意してください。これは、将来変更される可能性があることを意味します。これは、バージョン間で一貫性があるという約束がないだけでなく、その意図もないことを強く示唆しています。

仕様で一貫した疑似乱数が必要な場合は、アルゴリズムとシード値を指定する必要があります。実際、Randomそのような約束をするように指定されていたとしても、将来、仕様のすべてまたは一部の非 .NET 実装、またはそれと相互運用する何かが必要になった場合はどうなるでしょうか?

于 2012-08-31T11:35:53.297 に答える
1

これはおそらく、フレームワークのバージョンが異なるためです。これを見てください

于 2012-08-31T11:41:27.700 に答える
0

試したオンライン プロバイダーは、Microsoft が提供するものとは異なる、CLR の Mono 実装を使用している可能性があります。したがって、おそらくそれらのRandomクラスの実装は少し異なります。

于 2012-08-31T11:36:42.400 に答える