random 产生的随机数每一位都是随机的?

我查了半天维基百科,得到的结论跟 @Xi Yang是一样的。概述一下我查到的内容:从性质上说,你这样得到的序列当然是伪随机的。不过我们关心的是它的随机性对实际应用是否足够。有一系列统计测试可以用来评价随机数生成器的质量。测试的内容包括但远远不限于周期的长度、分布的均匀性、相邻数字的相关性。比较好的随机数生成器能够通过这些测试;更好的生成器满足更为苛刻的条件,达到在密码学上安全的程度。随机数生成器的原理有很多种,它们的质量各有优劣。有一种随机数生成算法叫Mersenne twister,它是目前应用最广泛的随机数生成算法。许多编程语言自带的随机数生成器使用的都是这种算法的一种特定实现MT19937,它每次生成一个32比特的随机数。MT19937具有一系列优点:1) 周期特别长(长达
random 产生的随机数每一位都是随机的?
);2) 分布的均匀程度高(具体指标及解释详见维基百科);3) 能通过一系列统计测试。不过,MT19937并没有达到密码学安全的水平。鉴于MT19937这么鲁棒,而用它生成的随机数序列进行的操作又那么简单(只是把1个32比特的随机数拆成32个1比特的随机数而已),我相信最终得到的随机数序列对于一般的应用来说都足够了,你关心的分布均匀等属性应该没有问题。当然,密码学应用是不行的。
■网友的回复
用mt19937,然后你就随意用好了。只要你不用它来干特别需要安全性的事情,一般都没事的。另外这东西还比一些看起来简单的随机数生成器比如C自带的那个快。C自带那个取决于具体实现,但是好像一般都很渣。而且生成的是从0到RAND_MAX的随机数,只要RAND_MAX不是2^n-1的形式你要的性质肯定就不满足,对吧?
■网友的回复
即使你生成的是真随机数,也是不可以这样的。绝大多数随机算法的错误率或运行时间在一定程度上依赖于生成的随机数间的独立性,你这样是完全不独立的。但是在特殊情况下,是可以做到去随机化(Derandomization)或者用尽量少的随机数来达到同样效果的(如果一般情况都可以有效做到,则P=BPP,这是open problem)。参见维基Randomized algorithm。
■网友的回复
你是说,你生成一个N位的随机数,然后一位一位地(或者几位几位地)用里面的内容?理论上,这取决于随机数生成器的性能。有些生成器的性能比较烂,你这样做可能会影响随机性。所以,如果不知道行不行,那就用MT19937好啦!这个通常都行。
■网友的回复
比如最简单的 random 生成算法 LFSR (Linear feedback shift register), 输入种子 seed 后, 通过bit之间的运算来算出下一个随机数, 所以这种情况下显然 bit 与 bit 之间不是真随机的, 而是存在某种规律. Linear feedback shift register而且随机不随机是个哲学问题....
■网友的回复
概率上讲的话,每个数位都还是随机的没问题,但是整体分布不随机,所以还是不好。
■网友的回复
随机数并不随机,这是蒙特卡罗老师强调的。
■网友的回复
【random 产生的随机数每一位都是随机的?】 难道随机数不就是这么产生的吗?参见matlab random state,当然除非算下一位比读内存更快。。。
■网友的回复
感觉这个问题在穿牛角尖。