作者回复: int __cdecl rand (
void
)
{
_ptiddata ptd = _getptd();
return( ((ptd->_holdrand = ptd->_holdrand * 214013L
+ 2531011L) >> 16) & 0x7fff );
}
作者回复: 当然会有重复数字了,因为你对rand的结果取余了。rand的循环长度可能很大,可取余100以后,就很容易出现重复啊。就比如101和100001取余100,不都是1么。
作者回复: d(^_^o) 你这总结的太棒了,我得记下来!
作者回复: d(^_^o)
作者回复: 对,time(0)这个方法每次返回与当前秒相关的一个数字,也就是说如果你的程序在1秒内运行完了,那么你每次rand之前设置的随机种子都是一个值,所以输出的就是一个值了。其实随机种子设置一次即可。你把那句话放到住函数的第一句再试试。
作者回复: d(^_^o)
作者回复: 有统一的答疑文章,往后看。
作者回复: 这个是你的理解有偏差了。随机种子是设置第一个状态,不设置随机种子,也会有一个默认的初始状态。rand的功能,是获得下一个随机值。执行100次,就是向后依次性的得到伪随机序列中的100个值。跟是否设置随机种子无关。设置了随机种子,是保证前后两次程序执行的结果不同。仔细理解一下这段。Y(^_^)Y
作者回复: 设置随机种子了么?多执行几次随机程序看看结果呢?
作者回复: 因为计算机的每个计算过程,都是一个固定的且确定的过程。也就是说,由这些固定过程所生成的所谓随机值,也都是个固定值。只是这个生成的固定值,我们事先不知道是几,但不代表,它是真随机。你需要好好理解一下真随机,所谓真随机,是说产生每个数字的概率都相等。
作者回复: 嗯,虽然我没看过他底层的实现。不过,我可以肯定的告诉你,js也是伪随机,而你的猜想,是一个十分靠谱且合理的猜想!d(^_^o)
作者回复: d(^_^o)
作者回复: 这个只是举个例子,说明伪随机序列其实是一个固定序列。
作者回复: Y(^_^)Y
作者回复: d(^_^o)