JavaScript随机数生成:空间中唯一的500个整数10^6:获取冲突

JavaScript随机数生成:空间中唯一的500个整数10^6:获取冲突,javascript,random,Javascript,Random,下面是一个在JS中生成随机整数的非常简单的例子,我不会以任何方式“扩展限制” 我只从一个非常大的空间,10^6,生成了500个唯一的随机整数 然而,如果你一直点击按钮,你偶尔会看到500个按钮中有499个或498个是独一无二的。这种情况并不经常发生,但可能每点击10次或15次就发生一次。为什么呢?我的空间是一百万。我不希望在每10次或20次点击频率为500次的样本中发生碰撞 要进行测试,请持续单击按钮并观看控制台 函数运行(){ var nums=新集合(); 对于(变量i=0;i

下面是一个在JS中生成随机整数的非常简单的例子,我不会以任何方式“扩展限制”

我只从一个非常大的空间,10^6,生成了500个唯一的随机整数

然而,如果你一直点击按钮,你偶尔会看到500个按钮中有499个或498个是独一无二的。这种情况并不经常发生,但可能每点击10次或15次就发生一次。为什么呢?我的空间是一百万。我不希望在每10次或20次点击频率为500次的样本中发生碰撞

要进行测试,请持续单击按钮并观看控制台

函数运行(){
var nums=新集合();
对于(变量i=0;i<500;i++){
nums.add(randomInteger10to6th());
}
console.clear();
log('随机10^6唯一整数集:'+nums.size);
}
函数randomInteger10to6th(){
返回Math.round(Math.random()*Math.pow(10,6))
}

运行500个随机整数,空格:10^6
“随机”的意思是:它是随机的。该范围内的每个值都有相同的被选择概率,无论之前选择了什么。因此,即使它选择了数字5,例如,它仍然有机会再次选择5,就像它选择任何其他数字一样。你不应该期望随机数避免重复——如果是,它们就不是随机的:)

“随机”的意思就是:它是随机的。该范围内的每个值都有相同的被选择概率,无论之前选择了什么。因此,即使它选择了数字5,例如,它仍然有机会再次选择5,就像它选择任何其他数字一样。你不应该期望随机数避免重复——如果是,它们就不是随机的:)

当你从1-1e6中选择500个随机数时,你看到所有唯一数字的概率可以计算如下: 1e6/1e6*999999/1e6*99999 8/1e6*…*999501/1e6

结果约为0.88

这意味着在超过10%的时间里,在500个随机数的列表中至少会有一个重复

您可以在下面的代码段中对100个实验验证此行为:

函数运行(){
var nums=新集合();
对于(变量i=0;i<500;i++){
nums.add(randomInteger10to6th());
}
返回nums;
}
函数randomInteger10to6th(){
返回Math.round(Math.random()*Math.pow(10,6))
}
//进行100个实验,看看有多少重复
变量uniques=0,碰撞=0;
对于(变量i=0;i<100;i++){
var nums=run();
如果(nums.size==500)uniques++;
else++;
}
log('生成唯一编号的运行',uniques);

log('导致冲突的运行',冲突)当您从1-1e6中选择500个随机数时,您看到所有唯一数字的概率可以计算如下: 1e6/1e6*999999/1e6*99999 8/1e6*…*999501/1e6

结果约为0.88

这意味着在超过10%的时间里,在500个随机数的列表中至少会有一个重复

您可以在下面的代码段中对100个实验验证此行为:

函数运行(){
var nums=新集合();
对于(变量i=0;i<500;i++){
nums.add(randomInteger10to6th());
}
返回nums;
}
函数randomInteger10to6th(){
返回Math.round(Math.random()*Math.pow(10,6))
}
//进行100个实验,看看有多少重复
变量uniques=0,碰撞=0;
对于(变量i=0;i<100;i++){
var nums=run();
如果(nums.size==500)uniques++;
else++;
}
log('生成唯一编号的运行',uniques);

log('导致冲突的运行',冲突)由于您从一个大样本中生成的随机数相对较少,您应该能够在发生冲突时重新生成一个新的数字。在达到500之前添加随机num将导致对随机生成器的一些额外调用,但它将保证500个唯一数字:

函数运行(){
var nums=新集合();
而(单位尺寸<500){
nums.add(randomInteger10to6th());
}
console.clear();
log('随机10^6唯一整数集:'+nums.size);
}
函数randomInteger10to6th(){
返回Math.round(Math.random()*Math.pow(10,6))
}

运行500个随机整数,空格:10^6
因为您从一个大样本中生成的随机数相对较少,所以您应该能够在碰撞时重新生成一个新的数。在达到500之前添加随机num将导致对随机生成器的一些额外调用,但它将保证500个唯一数字:

函数运行(){
var nums=新集合();
而(单位尺寸<500){
nums.add(randomInteger10to6th());
}
console.clear();
log('随机10^6唯一整数集:'+nums.size);
}
函数randomInteger10to6th(){
返回Math.round(Math.random()*Math.pow(10,6))
}

运行500个随机整数,空格:10^6
您也可以使用简单数组而不是
Set()
。首先,创建500个索引的数组,然后填充它

函数运行(){
/*首先创建一个包含500个插槽的阵列,然后用
未定义(不带参数的fill()未定义)
最后一步映射500个未定义和覆盖的插槽
它是一个随机数*/
返回新数组(500.fill().map(x=>Math.round(Math.random()*Math.pow(10,6)))
}
console.log(run().length)

运行500个随机整数,空格:10^6
您也可以使用简单数组而不是
Set()
。首先,创建500个索引的数组,然后填充它

函数运行(){
/*首先创建一个包含500个插槽的阵列,然后用
未定义(不带参数的fill()未定义)
最后一次