2016-04-05 76 views
-2

確定以獲得更高的數字,所以我在JavaScript中的數字非常大的陣列:的JavaScript獲得隨機數:概率較低的區間

[1, 1.01, 1.02, 1.03, ..., 1.99, 2, ..., 9.98, 9.99, ..., 299.99, 300] 

而我需要的是使用隨機段,讓他們中的一個。所以基本上我需要隨機數字,但最重要的是我需要隨機使用彩票風格。因此,獲得「1」的機會將是30 000(非常高),獲得1.01的機會將是29 999.但根據這個陣列中的所有數字,得到300的機會將非常低。

我希望你能理解這個問題,並幫助我解決這個問題。正如我之前提到的,這必須由100%隨機,我不知道如何使它..

的解決方案,我有迄今:

我試圖通過添加多個以粉牆數組相同的數字,並降低每一步的計數。所以我增加了30000單位的129999單位的1.01 ...和2個單位的299.99和一個單位的300.但陣列變得非常大,我來到這裏尋找更好的解決方案。

而且我發現這個:https://stackoverflow.com/a/13758064/5786106 ,它似乎是答案給我,但我不知道如何與十進制系統使用它(0.01,0.02,0.99 ...)

var num = Math.pow(Math.floor(Math.random()*10), 2);

+0

所以要正確的標題,那是一個很大的原因,得到的youre下來投票現在 – JordanHendrix

+0

我需要一個麒麟,我不知道如何得到一個。你有什麼嘗試?你看到了什麼?向我們展示一些努力,我們不是一個代碼寫作機器,可以爲您完成您的項目。 – indubitablee

+0

我甚至無法格式化正確的標題,因爲我不知道我需要什麼。是的,我會寫我迄今爲止所嘗試的。 –

回答

2

一個解決方案是製作您建議的非常大的數組,但要使其虛擬化,而不用在代碼中構建該對象。

想象陣列要多久?那麼你的數組裏有(300 - 1)* 100 + 1 = 29,901個元素。然後在虛數組中有(29,901 + 1)*(29,901/2)= 447,049,851個元素。因此,第一個步驟是在0和447049850之間產生一個隨機整數:

var imaginaryIndex = Math.floor(Math.random() * 447049851); 

下一步是確定哪些實折射率的原始數組中對應於假想陣列中的imaginaryIndex。

var indexFromEnd = 0; 
while((indexFromEnd + 2) * ((indexFromEnd + 1)/2) < imaginaryIndex) 
    indexFromEnd++; 

最後,你需要根據它在哪裏你的陣列來計算您的數組中元素的值:

return 300 - (indexFromEnd * 0.01); 

現在,讓我們清理一下,並把它放在一個漂亮的,可重複使用功能:

function triangularWeightedRandomSelect(myArray){ 
    var imaginaryIndex = 
     Math.floor(Math.random() * (myArray.length + 1) * myArray.length/2); 
    var indexFromEnd = 0; 
    while((indexFromEnd + 2) * ((indexFromEnd + 1)/2) < imaginaryIndex) 
     indexFromEnd++; 
    return myArray[myArray.length - 1 - indexFromEnd]; 
} 
+0

它似乎工作和運作良好,但它是否正確,如果它給我很高的數字,然後較低的?因爲它應該給150-150更多,然後150-300。應該經常生成1-2個範圍,然後是其他人:http://pastebin.com/r397YQcx –

+0

是的,根據您的要求,數量應該在0-150 75%的範圍內,它應該落入範圍1-2約爲時間的0.7%,超過任何其他100個元素的範圍。順便說一下,我意識到你的數組長度爲29900個元素,而不是30000個,所以我的代碼中有一個偶爾在0-1範圍內產生的小錯誤。我會在某個時候修正 –

+0

修正了這個錯誤。元素數量是29901 –