gpt4 book ai didi

Javascript按随机百分比执行函数

转载 作者:行者123 更新时间:2023-12-03 18:56:26 25 4
gpt4 key购买 nike

可以说,我想按百分比触发一个函数

function A () { console.log('A triggered'); } //50% chance to trigger

if (Math.random() >= 0.5) A();

现在我想添加更多机会触发的功能,我所做的是

//method 1
function B () { console.log('B triggered'); } //10% chance to trigger
function C () { console.log('C triggered'); } //10% chance to trigger

if (Math.random() >= 0.5) {
A();
} else if (Math.random() > (0.5 + 0.1)) {
B();
} else if (Math.random() > (0.5 + 0.1 + 0.1)) {
C();
}

但这使得 A() 优先于 B() 和 C()。因此我将代码更改为

//method 2
var randNumber = Math.random();

if (randNumber <= 0.5) { A(); }
else if (randNumber > 0.5 && randNumber <= (0.5 + 0.1)) { B(); }
else if (randNumber > (0.5 + 0.1) && randNumber <= (0.5 + 0.1 + 0.1)) { C(); }

这种方法看起来 公平 但它看起来效率低下,因为它需要在每个单独的 if else 函数中硬编码机会,如果我有列出很长的函数和触发机会,我需要把if else弄得又长又乱

请问有什么方法可以让我做得更好更高效吗?与我上面显示的这两种方法不同。

*另外公平公正也很重要(听起来像游戏)

抱歉,如果我解释的情况不好,对此的任何帮助将不胜感激。谢谢。

最佳答案

您可以创建一个您想要调用的函数的列表以及它们被调用的机会。然后,您使用机会将随机数的范围划分为多个 block 。在此示例中,它将是:

0.0         0.5           0.6           0.7
0.5/A 0.1/B 0.1/C

条目不需要根据机会进行排序。如果机会总和大于 1.0,则不会调用数组的最后一个元素。使用这种方法,您需要确保自己做到这一点。

代码可能如下所示:

function A() {
console.log('A was called')
}

function B() {
console.log('B was called')
}

function C() {
console.log('C was called')
}


var list = [
{chance: 0.5, func: A},
{chance: 0.1, func: B},
{chance: 0.1, func: C}
];

function callRandomFunction(list) {
var rand = Math.random() // get a random number between 0 and 1
var accumulatedChance = 0 // used to figure out the current

var found = list.find(function(element) { // iterate through all elements
accumulatedChance += element.chance // accumulate the chances
return accumulatedChance >= rand // tests if the element is in the range and if yes this item is stored in 'found'
})

if( found ) {
console.log('match found for: ' + rand)
found.func()
} else {
console.log('no match found for: ' + rand)
}
}

callRandomFunction(list)

关于Javascript按随机百分比执行函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50268743/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com