2013-12-22 31 views
0

我必须将一个C++程序移植到C#中。在C++和.NET中生成相同的随机数

程序中涉及随机数字。我必须在两个程序中产生完全相同的随机数以在测试中获得相同的结果。

在C++中我使用

srand(1000) 
... 
double r = (double)rand()/(double)(RAND_MAX); 

和在C#我使用

private readonly Random _rnd = new Random(1000); 
... 
_rnd.NextDouble() 

然而方案尽管相同的种子产生不同的数字。有什么办法可以产生相同的随机数字吗?

+1

“同样的随机数”。有点矛盾,也许? – dandan78

+0

我会打赌''的东西,特别是与梅森扭转者的东西。我也会在C#上打赌说明你需要寻找什么。 – chris

回答

0

基本上,随机函数(srand vs Random)具有不同的底层实现,因此您不能依赖它们给出相同的输出。那么,为什么不提供一组“n”数字并将它们在C++和c#中输入到您的算法中 - 仅仅用于测试目的?这样你就可以确定你会有相同的数量,相同的数字和相同的顺序。例如:在每行上都有一些数字的文件,然后在C++/c#中读出它们,然后将这些数字输入到您要“测试”的算法中。因此,根据你对我上面的问题的回答,你可以在这里测试你的算法(移植后的算法),或者这两种语言的“随机”功能,与您的案例相关的答案可能会有很大差异!那么您能否给我们提供更多的上下文?)

+0

这是我的逃跑计划。如果我找不到任何其他解决方案,我将创建一个包含一系列随机数的文件,然后使用它来编程。 – maxc900

+1

我使用随机数来分配粒子的速度。那些粒子在彼此和墙壁之间相互碰撞。因此,如果初始速度不同,系统的最终状态也会不同。 – maxc900

+0

感谢您提供的上下文。然而,如果它只是一次性的(用于测试),你可以参考我的建议,但是如果在c和.net端口都需要结构化的话,那么我会说@VX的答案/建议。 –

1

你知道吗,什么算法用于C++ rand和c#Random class?

你可以尝试自己实现一些PNG。例如。 LCG算法非常简单并且易于在两种语言中实现...只需使用wiki页面中的一些常用参数即可。

+0

的确如此,但是当他只需要“测试”的时候很多工作,而不是?我想我们需要更多的上下文来理解他为什么总是需要相同的输出。我认为这是为了测试,但如果它是基本的,那么推出自己的确是一个好主意。或者可能使用P/Invoke来调用srand的c/C++库.. –

+0

'class CRandom {unsigned int m_seed; CRandom(int seed){m_seed = seed;} unsigned int Next(){m_seed = 1664525 * m_seed + 1013904223;返回m_seed;}};'这似乎并没有太多的工作.... –

+0

是的伊夫斯是正确的。实施一些其他的事情会对我造成负担。 – maxc900

0

我用这个

Random rnd = new Random(); 

我的声明。

和此:

Convert.ToString(rnd.Next(1, 49)) 

当按下按钮的执行。

也许你可以有一个有用的使用。

问候

+0

但是这不会产生与srand相同的输出,不是吗? –