好的,所以我在javascript中有很多数字:
[1, 1.01, 1.02, 1.03, ..., 1.99, 2, ..., 9.98, 9.99, ..., 299.99, 300]
我需要的是让其中一个使用随机段。所以基本上我需要随机数,但问题是我需要随机使用彩票风格。因此获得“1”的机会将是30 000(非常高)并且获得1.01的机会将是29 999.但是根据该阵列中的所有数字,获得300的机会将非常低。
我希望你能理解这个问题,并帮助我解决这个问题。正如我之前提到的,这必须是100%随机的,我不知道如何制作它..
我到目前为止的解决方案:
我试图通过添加多个相同的数字来扩展数组,并通过每一步减少它的数量。所以我添加了30000
单位1
和29999
单位1.01
...和2个单位299.99和一个单位300.但阵列变得非常大我来这里寻找更好的解决方案。
我也发现了这个:https://stackoverflow.com/a/13758064/5786106 它似乎是我的答案,但我不知道如何使用十进制系统(0.01,0.02,... 0.99)
var num = Math.pow(Math.floor(Math.random()*10), 2);
答案 0 :(得分:2)
一种解决方案是制作你提出的非常大的数组,但要使其成为虚构,而不必在代码中构造该对象。
虚构阵列需要多长时间?那么你的数组中有(300 - 1)* 100 + 1 = 29,901个元素。然后在虚数组中有(29,901 + 1)*(29,901 / 2)= 447,049,851个元素。所以第一步是生成0到447,049,850之间的随机整数:
var imaginaryIndex = Math.floor(Math.random() * 447049851);
下一步是确定原始数组中哪个真实索引对应于虚数组中的imaginaryIndex。
var indexFromEnd = 0;
while((indexFromEnd + 2) * ((indexFromEnd + 1) / 2) < imaginaryIndex)
indexFromEnd++;
最后,您需要根据数组中元素的位置计算元素的值:
return 300 - (indexFromEnd * 0.01);
现在让我们把它清理干净并将其放入一个漂亮的,可重复使用的功能中:
function triangularWeightedRandomSelect(myArray){
var imaginaryIndex =
Math.floor(Math.random() * (myArray.length + 1) * myArray.length / 2);
var indexFromEnd = 0;
while((indexFromEnd + 2) * ((indexFromEnd + 1) / 2) < imaginaryIndex)
indexFromEnd++;
return myArray[myArray.length - 1 - indexFromEnd];
}