2009-06-17 12 views
0

乱数の同じシーケンスがMSVC++プログラムとC#.NETプログラムから出るようにするにはどうすればよいですか?MSVC++ rand()とC#System.Randomの関係

可能ですか? MSVC++ rand()System.Randomの間に関係はありますか?

以下の例では完全に異なるようです。

#include <iostream> 
using namespace std; 

int main() 
{ 
    srand(1) ; 

    cout << rand() << endl << 
    rand() << endl << 
    rand() << endl ; 
} 
using System; 

class Program 
{ 
    static void Main(string[] args) 
    { 
    Random random = new Random(1); 

    Console.WriteLine(random.Next()); 
    Console.WriteLine(random.Next()); 
    Console.WriteLine(random.Next()); 
    } 
} 

答えて

2

アンマネージドC++で.NETのマネージドライブラリを使用することは可能です(厳密には簡単ではありません)。 MSDNのドキュメントをご覧ください。

5

これを行う最も簡単な方法は、種としてのパラメータを持つ乱数ジェネレータが含まれているC++ DLLへの管理対象外の参照を作ることであろう。そうすれば、彼らは同じであると確信することができます。

+2

これは正しい方法であり、受け入れられる回答ではありません。ランダム関数のためだけにCLRを導入することは狂気になります。 – Qix

3

はいこれは非常に異なる機能です。時々、BCLクラスは、ネイティブの対応するもののまわりの非常に薄いラッパーであり、PInvokeを使ってそれを実行します。 System.Randomの場合はそうではありません。これは100%管理された実装であり、srandバージョンとは完全に別です。

少しお手伝いして、同じ番号のセットを使用する理由を説明できますか?それは例えばテスト用ですか?

本当に同じ乱数セットが必要な場合は、srandをラップする簡単なCOMオブジェクトを作成することもできます。 COMオブジェクトは、マネージコードとネイティブコードの両方で使用できるため、両方の場所で同じアルゴリズムを使用できるようになります。

+0

私は自分のプロジェクトの1つをC#からC++に移植しています。 そのタイプのシミュレーションです。同じ乱数シーケンスを使用して何かを逃したかどうかをすぐに確認したいので、両方のウィンドウで同じように見えるように_expect_することができます! – bobobobo