开发者问题收集

JavaScript获得随机结果,特定数组的概率

2018-03-08
4037

我有一个数组,我需要按下随机显示输出以下是我的代码

511593604

我有基本的Math.random()它随机显示图像,现在我需要以概率显示出来,例如显示[“ Images/fancely-logo.png”,“ 12.65”]的概率为50%,[images/facneration-word.png'' ,“ 10.00”]为25%,[“图像/freeproduct.png”,“ 15.50”]为25%。

谢谢大家的帮助

3个回答

一种选择是添加第三个元素来表示概率的权重。

在下面的例子中, fantastic-logo.png 有 2 个元素代表 50%,另外 2 个元素只有 1 个,每个元素代表 25%。

然后创建一个 4 元素数组 [0,0,1,2] - 这表示元素 0 有 50% 的机会。元素 1 有 25% 的机会,元素 2 也有 25%。

从新创建的数组中随机选取一个值作为位置。

例如:

var shirts = [
  ["images/fantastic-logo.png", "12.65", 2],
  ["images/fantastic-word.png", "10.00", 1],
  ["images/free-product.png", "15.50", 1]
];

//Create a 4 element array based on probability weight
var probability = shirts.map((v, i) => Array(v[2]).fill(i)).reduce((c, v) => c.concat(v), []);

//Random select from probability array
var pos = probability[Math.floor((Math.random() * probability.length))];

$("#image").html($("<img/>").attr("src", shirts[pos][0]));
$(".price").html("$" + shirts[pos][1]);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="image"></div>
<div class="price"></div>
Eddie
2018-03-08
611652325

如果获得0或1,则选择了第一个图像。但是这种方法不是优雅的。请参阅下面的链接。

产生加权随机数

Ray
2018-03-08

对于短数组,这应该足够了,使用 Mozilla 开发人员 中的 getRandomInt

function getRandomInt(max) {
    return Math.floor(Math.random() * Math.floor(max));
}

var shirts = [
    ["images/fantastic-logo.png", "12.65"],
    ["images/fantastic-word.png", "10.00"],
    ["images/free-product.png", "15.50"]
];

var random = getRandomInt(100);
var selectedShirt;
if (random <= 50) {
    selectedShirt = shirts[0];
} else if (random > 50 && random < 75) {
    selectedShirt = shirts[1];
} else {
    selectedShirt = shirts[2];
}

$("#image").html($("<img/>").attr("src", shirts[selectedShirt][0]));
$(".price").html("$" + shirts[selectedShirt][1]);

请注意,您可以像 Ray 的答案中那样使用较少的数字。对于更大的数组,您可以使用 更好的方法

Diogo
2018-03-08