Random 使用vb6生成大量32位随机数

Random 使用vb6生成大量32位随机数,random,vb6,Random,Vb6,我有一个VB6代码循环,执行次数超过1000000次。每次执行循环时,都会生成一个32位随机数。每个循环的处理时间约为每秒250个循环。问题是我最终得到了大约30000个重复的数字。我的理解是,Rnd函数使用系统启动后经过的毫秒数。这意味着系统“种子”在每个循环中都发生了变化,但仍然得到了重复项。 例如: i=1到1000000的 “做一堆代码 '在具有的函数中使用Rnd两次获取32位随机数 '每个Rnd前的随机化语句 “再做一堆代码 接下来我 有什么想法吗? 感谢and的预期用途是在程序开始

我有一个VB6代码循环,执行次数超过1000000次。每次执行循环时,都会生成一个32位随机数。每个循环的处理时间约为每秒250个循环。问题是我最终得到了大约30000个重复的数字。我的理解是,
Rnd
函数使用系统启动后经过的毫秒数。这意味着系统“种子”在每个循环中都发生了变化,但仍然得到了重复项。
例如:

i=1到1000000的

“做一堆代码
'在具有的函数中使用Rnd两次获取32位随机数
'每个Rnd前的随机化语句
“再做一堆代码
接下来我
有什么想法吗?
感谢

and的预期用途是在程序开始时调用Randomize一次以初始化随机数生成器,然后调用Rnd以获取所需的随机数序列。在每次使用Rnd之前调用Randomize会适得其反,因为每次调用它时都会重新初始化生成器

请注意,您仍然可能会得到一些重复的数字,因为这就是随机性的工作原理。请参阅Eric Lippert在“”上的文章,如果您从232个选项中提取100万个数字,那么您至少发生一次碰撞的概率非常接近100%

另外,请注意Rnd不会提供加密强度随机数,因此如果需要,则需要调用Windows crypto API或以其他方式找到更好的源。

和的预期用途是在程序开始时调用Randomize一次以初始化随机数生成器,然后调用Rnd获取所需的随机数序列。在每次使用Rnd之前调用Randomize会适得其反,因为每次调用它时都会重新初始化生成器

请注意,您仍然可能会得到一些重复的数字,因为这就是随机性的工作原理。请参阅Eric Lippert在“”上的文章,如果您从232个选项中提取100万个数字,那么您至少发生一次碰撞的概率非常接近100%


另外,请注意Rnd不会提供加密强度随机数,因此如果需要,则需要调用Windows crypto API或以其他方式找到更好的源。

生成随机数不会将其从随机数池中删除。换句话说,有些数字可能是重复的。这不是一个bug;这就是不可预测性的工作原理。如果你想要唯一的数字,你需要通过丢弃重复的数字来强制实现。我猜问题是因为你在循环中调用了randomize。如果您不断地重新播种,并多次使用同一种子,可能会产生大量重复。循环将运行得如此之快,以至于您多次使用相同的种子时间。只需在循环之前调用randomize一次-这有帮助吗?(针对我曾经问过的一个问题)有一个很好的图形,它说明了如果你在循环中调用
随机化
可能会发生的一些奇怪的事情。这样想:假设你没有选择一百万个32位的数字,而是选择了四个3位的数字——也就是说,在0和7之间。获得副本的概率是多少?事实上,计算不重复的概率更容易。如果你计算一下,你会发现重复的情况非常普遍。从40亿个可能性中抽取的100万个数字中,有30000个是正确的。如果您不想重复,请从128位数字中提取它们;这些数字足够多,您将无法获得重复的数字。生成随机数不会将其从随机数池中移除。换句话说,有些数字可能是重复的。这不是一个bug;这就是不可预测性的工作原理。如果你想要唯一的数字,你需要通过丢弃重复的数字来强制实现。我猜问题是因为你在循环中调用了randomize。如果您不断地重新播种,并多次使用同一种子,可能会产生大量重复。循环将运行得如此之快,以至于您多次使用相同的种子时间。只需在循环之前调用randomize一次-这有帮助吗?(针对我曾经问过的一个问题)有一个很好的图形,它说明了如果你在循环中调用
随机化
可能会发生的一些奇怪的事情。这样想:假设你没有选择一百万个32位的数字,而是选择了四个3位的数字——也就是说,在0和7之间。获得副本的概率是多少?事实上,计算不重复的概率更容易。如果你计算一下,你会发现重复的情况非常普遍。从40亿个可能性中抽取的100万个数字中,有30000个是正确的。如果您不想重复,请从128位数字中提取它们;有足够的这些,你不会得到重复。