【问题标题】:javascript get random number: lower probability to get higher number in the intervaljavascript获取随机数:在区间内获得更高数字的概率较低
【发布时间】:2016-04-05 21:01:29
【问题描述】:

好的,所以我在 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 单位129999 单位1.01 ...以及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);

【问题讨论】:

  • 所以写正确的标题,这就是你现在被否决的一个重要原因
  • 我需要一只独角兽,但我不知道如何获得。你试过什么?你调查了什么?向我们展示一些努力,我们不是为您完成项目/硬件的代码编写机器。
  • 我什至无法格式化正确的标题,因为我完全不知道我需要什么。是的,我会写我到目前为止所尝试的。
  • @DaumantasKarpavicius 如果你不知道你需要什么,你怎么能指望有人帮助你呢?我认为您需要阅读随机数分布。也许看看其他解决方案,例如github.com/ckknight/random-js 看看。没有 100% 随机的东西,总会有某种程度的偏见。
  • @Eihwaz,不,不一定有偏见:Math.random() 没有偏见,除非你在谈论伪随机性和真正随机性之间的区别,这不是提问者感兴趣的所有内容。

标签: javascript arrays random


【解决方案1】:

一种解决方案是制作您建议的非常大的数组,但要使其成为虚构,而无需在代码中构造该对象。

这个假想数组有多长?好吧,您的数组中有 (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];
}

【讨论】:

  • 它似乎工作得很好,但如果它经常给我高数字然后低数字它是否正确?因为它应该比 150-300 更频繁地给出 0-150。并且应该比其他范围更频繁地生成 1-2 范围:pastebin.com/r397YQcx
  • 是的,根据您的要求,75% 的时间应该在 0-150 范围内,大约 0.7% 的时间应该在 1-2 范围内,比任何一个都多其他 100 元素范围。顺便说一句,我意识到你的数组有 29900 个元素长,而不是 30000,所以我的代码中有一个小错误,偶尔会在 0-1 范围内生成。我会在某个时候修复
  • 修复了这个错误。 # 元素是 29901
猜你喜欢
  • 2021-06-30
  • 2011-12-25
  • 2011-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多