2014-11-25 40 views
5

我有由现在退休雇员产生了一些代码工作取得了一些只需要几位,我有一个关于随机数很少的一些奇怪的事情。在某些时候,他将由PRNG 10位返回的值向右移动,然后在该值上使用掩码。它是安全的,从一个梅森倍捻机

我已经在互联网上看到一些PRNG具有较差的随机性特性,它们生成的数字中有一些位(像最后一个,只是在1和0之间交替),但是我搜索了是否存在某些litterture Mersenne Twister出现这样的问题,但我还没有发现任何问题。有人知道这件事吗?

+0

此代码的主要是产生高斯噪声,所以RAU由瑞利表服用,索引是移位和掩模数,而TETA从相同的随机数取,但这次只掩蔽,不移动。 – Loufylouf 2014-11-25 14:33:46

+0

在C++ 11中,声明一个干净的高斯生成器需要两行代码。如果C++ 11是一个选项,用STL替换所有旧的,不失效的自定义生成器可能是一个不错的选择。 – galinette 2014-11-25 16:05:20

+0

好观看:http://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful – galinette 2014-11-25 16:06:45

回答

1

通常情况下,任何一点应该是随机的,这是梅森捻线机的属性。

但是(我不知道MT得很深),你可能有一些位之间的长期依赖。 建议使用库函数来设置整数范围,而不是自己排列这些位,否则您永远不会知道它可能获得的复杂属性。

如果您使用C++ 11标准库,只使用std :: mt19937在一起的std :: uniform_int_distribution

-1

我不知道梅森倍捻机特别,但想到什么是典型的在尝试获得范围[0,n)内的随机整数时得到的建议。如果你有一个PRNG返回整数具有更大的范围比N,你不应该使用模,以减少类似

x = rand() % n; 

范围,但应该重新调整数

x = (int) floor(((double) rand())/((double) RAND_MAX)) * n); 

代替。原因是伪随机数的最重要的位通常比较小的位更随机,所以尽管模操作保持了很好的并且没有浮点,但它也丢弃了那些宝贵的重要位。

虽然我不知道你提到的代码试图做什么,但可能是右移加掩码可能是以减少最低有效位的方式来减少随机数的范围。

+0

我的猜测是,他知道自己是被利用PRNG与前几位随机性较差的特性,所以他转向这个数字用面膜上的数字“最随机”位。但不幸的是,这只是一个猜测。 – Loufylouf 2014-11-25 14:32:10

+0

这只是绝对低劣的PRNGs(通常是'rand()')的情况。但是,适当的选择是迁移到更好的PRNG,而不是抛光烂泥。即使像Mersenne Twister这样普通的PRNG,这也不是问题。 – CodesInChaos 2014-11-25 14:32:53

+0

我只是想帮助回答一个问题。问题是关于'C'和其他员工_退休,PRNG可能不是最好的假设是有效的。关于更新/编写新代码的建议,我只是建议使用像GSL这样的库。 – 2014-11-25 15:11:15