我正在嘗試生成1和最大值之間的隨機數。這個我沒有問題,這樣做並用以下操作:在權重/偏差範圍內生成一個隨機數?
var max = 200;
var randomNumber = Math.floor(Math.random() * max) + 1;
然而,在理想的情況下,我想1和我的最大值之間產生了一些,不過較低的數字有較高的概率發生。我希望變量偏向1,但是我的數學技能還不夠強大,如果有人能指出我正確的方向,那將是非常好的。
謝謝
喬希
我正在嘗試生成1和最大值之間的隨機數。這個我沒有問題,這樣做並用以下操作:在權重/偏差範圍內生成一個隨機數?
var max = 200;
var randomNumber = Math.floor(Math.random() * max) + 1;
然而,在理想的情況下,我想1和我的最大值之間產生了一些,不過較低的數字有較高的概率發生。我希望變量偏向1,但是我的數學技能還不夠強大,如果有人能指出我正確的方向,那將是非常好的。
謝謝
喬希
一個簡單的方法將是剛方的Math.random的結果()。由於函數的結果在0和1之間,所以正方形也將在[0,1]的範圍內,但是例如0.5的值將映射到較低的值--0.25。您可以嘗試1以上的功率,直到找到可接受的功能。
我得到了一個java代碼,它可以做你想做的事情。 你應該爲int [] prob數組選擇你自己的概率。 我認爲它不會很難將其翻譯爲js或構建水平。等於。
int[] probs;
void initRandom(int n, int[] probabilities)
{
int i,j,begin=0,end=0,sum=0;
int[] probs;
// sum of all propabilitys must be 100%
for(i=0;i<probabilities.length;i++) sum+=probabilities[i];
probs=new int[sum];
// fills numbers from 0 till n-1 in regard to their probabilities
// to the probability array.
for(i=0;i<n;i++)
{
begin=end;
end+=probabilities[i];
for(j=begin;j<end;j++) probs[j]=i;
}
}
int genRandom()
{
return probs[smallRand(probs.length-1)];
}
這是一個非常普遍的問題。首先考慮這個鏈接這裏 http://en.wikipedia.org/wiki/List_of_probability_distributions#Supported_on_a_bounded_interval 它顯示了一些概率函數是有界的,我相信你正在尋找(自min = 1和max = max)。 您也可以選擇一個半無限區間,並忽略超過最大值的所有值。我認爲,這也可以接受,取決於您的應用程序。
接下來,選擇一個最適合您的概率函數。爲了簡單起見,我通過反轉CDF選擇了三角分佈
的分佈函數是(PDF和CDF)
f(x) = 2/(2*max-1-max^2)*(x-max)
F(x) = 2/(2*max-1-max^2)*(0.5*x^2-max*x-0.5+max)
,以便可以通過一個均勻分佈生成0-1偏壓分佈像
var urand = Math.random();
var a = 2/(2*max-1-max^2);
var randomNumber = max-Math.sqrt(max*max-2*(max-urand/a-0.5));
乾杯 [R
以下功能我做了讓你接近一個偏置隨機NU mber
function rand(max) {
var r = Math.random();
r = 1/(101-100 * r);
return Math.floor(r * max) - 1;
}
它只使用簡單的算術運算,因此它應該相當快。