创建一个返回随机整数但具有指定分布的Javascript函数/" weight"

时间:2017-11-02 00:54:08

标签: javascript probability non-uniform-distribution

我有一系列值:

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返回5,比如25%的时间,返回4 ,14%的时间,并返回任何其他数字......

(100 - 25 - 14)/(my_arr.length - 2)

......%的时间。

在我进行研究时,我遇到了几个posts that describe similar problems,但他们的答案不是Javascript,我,唉,还不够数学来理解他们的一般原则。任何建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

这可能不如您所寻找的那么精确,但这肯定有效。基本上这段代码会返回一个像你这样的最小值和最大值指定的随机数,但只有在根据给定的机会解决优先级数后才会这样。

首先,我们必须在代码中优先您的优先级数字。如果您的优先级数字没有命中,那就是我们进入正常的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));
}
&#13;
<!DOCTYPE html>
<html>
<body style='height: 1000px; width: 100%;'></body>
<script></script>
</html>
&#13;
&#13;
&#13;

此代码对所有优先级数组应用一次机会。如果您希望优先级列表中的每个数字都有个别机会,我们必须修改结构并将参数更改为包含

之类的对象的单个数组。
var priorityList = [{num: 4, chance: 25},
                    {num: 5, chance: 12}]