创建一个 Javascript 函数,该函数 returns 随机整数但具有指定的分布/"weight"
Creating a Javascript function that returns random integers but with a specified distribution/"weight"
我有一组值:
var my_arr = [/*all kinds of stuff*/]
我有一个生成随机数的函数,我将其用作 my_arr
...
中元素的索引
var RandomFromRange = function (min,max)
{
return Math.floor(Math.random()*(max-min+1)+min);
};
...所以我可以做这样的事情:
my_arr[RandomFromRange(0,my_arr.length)];
我想做的是指定 my_arr
中的某些元素具有 "priority",这样 RandomFromRange
returns 5,比方说,25% 的时间, returns 4, 14% 的时间, returns 任何其他数字...
(100 - 25 - 14)/(my_arr.length - 2)
...% 的时间。
在我做研究的过程中,我遇到了几个 posts that describe similar problems,但他们的答案不在 Javascript 中,唉,我没有足够的数学来理解他们的一般原理.如有任何建议,我们将不胜感激。
这可能与您要找的不完全一样,但这确实有效。基本上这个代码 returns 一个像你的一样从最小值和最大值指定的随机数,但只有在根据给定的机会解决优先级数字之后。
首先我们要在代码中确定您的优先级数字。如果没有命中您的优先级数字,那就是我们进行正常 RNG 的时候。
//priority = list of numbers as priority,
//chance = the percentage
//min and max are your parameters
var randomFromRange = function (min,max,priority,chance)
{
var val = null; //initialize value to return
for(var i = 0; i < priority.length; i++){ //loop through priority numbers
var roll = Math.floor(Math.random()*100); //roll the dice (outputs 0-100)
if(chance > roll){ ///check if the chance is greater than the roll output, if true, there's a hit. Less chance value means less likely that the chance value is greater than the roll output
val = priority[i]; //make the current number in the priority loop the value to return;
break; //if there's a hit, stop the loop.
}
else{
continue; //else, keep looping through the priority list
}
}
//if there is no hit to any priority numbers, return a number from the min and max range
if(val == null){
val = Math.floor(Math.random()*(max-min+1)+min);
}
//return the value and do whatever you want with it
return val;
};
document.getElementsByTagName('body')[0].onclick = function (){
console.log(randomFromRange(0,10,[20,30],50));
}
<!DOCTYPE html>
<html>
<body style='height: 1000px; width: 100%;'></body>
<script></script>
</html>
此代码对所有优先级数字数组应用一次机会。如果您希望优先级列表中的每个数字都有单独的机会,我们必须修改结构并将参数更改为单个对象数组,其中包含
var priorityList = [{num: 4, chance: 25},
{num: 5, chance: 12}]
等等
我有一组值:
var my_arr = [/*all kinds of stuff*/]
我有一个生成随机数的函数,我将其用作 my_arr
...
var RandomFromRange = function (min,max)
{
return Math.floor(Math.random()*(max-min+1)+min);
};
...所以我可以做这样的事情:
my_arr[RandomFromRange(0,my_arr.length)];
我想做的是指定 my_arr
中的某些元素具有 "priority",这样 RandomFromRange
returns 5,比方说,25% 的时间, returns 4, 14% 的时间, returns 任何其他数字...
(100 - 25 - 14)/(my_arr.length - 2)
...% 的时间。
在我做研究的过程中,我遇到了几个 posts that describe similar problems,但他们的答案不在 Javascript 中,唉,我没有足够的数学来理解他们的一般原理.如有任何建议,我们将不胜感激。
这可能与您要找的不完全一样,但这确实有效。基本上这个代码 returns 一个像你的一样从最小值和最大值指定的随机数,但只有在根据给定的机会解决优先级数字之后。
首先我们要在代码中确定您的优先级数字。如果没有命中您的优先级数字,那就是我们进行正常 RNG 的时候。
//priority = list of numbers as priority,
//chance = the percentage
//min and max are your parameters
var randomFromRange = function (min,max,priority,chance)
{
var val = null; //initialize value to return
for(var i = 0; i < priority.length; i++){ //loop through priority numbers
var roll = Math.floor(Math.random()*100); //roll the dice (outputs 0-100)
if(chance > roll){ ///check if the chance is greater than the roll output, if true, there's a hit. Less chance value means less likely that the chance value is greater than the roll output
val = priority[i]; //make the current number in the priority loop the value to return;
break; //if there's a hit, stop the loop.
}
else{
continue; //else, keep looping through the priority list
}
}
//if there is no hit to any priority numbers, return a number from the min and max range
if(val == null){
val = Math.floor(Math.random()*(max-min+1)+min);
}
//return the value and do whatever you want with it
return val;
};
document.getElementsByTagName('body')[0].onclick = function (){
console.log(randomFromRange(0,10,[20,30],50));
}
<!DOCTYPE html>
<html>
<body style='height: 1000px; width: 100%;'></body>
<script></script>
</html>
此代码对所有优先级数字数组应用一次机会。如果您希望优先级列表中的每个数字都有单独的机会,我们必须修改结构并将参数更改为单个对象数组,其中包含
var priorityList = [{num: 4, chance: 25},
{num: 5, chance: 12}]
等等