2011-11-28 35 views
1

我有一個數組數組,每個這些數字代表重量。數組中的數字在0和1之間,這些數字的總和總和爲1.因此,如果說array [1]是0.6,那表示我希望它顯示大約60%的時間。數組本身並不爲我所知,所以我不知道這些數字,它們是用戶輸入的例子。機會邏輯問題/重構(javascript)

我有一個解決方案,但我不知道它是否是最有效的方式來做到這一點。我的解決方案似乎效率很低。這是

  • 產生隨機數
  • 複製該用戶輸入數組到一個新的數組和排序從最小到最大
  • 比較在這個新的數組中的隨機數來數,所以它會從比較數組中的最小值到最大值,當隨機數小於數組數時,我會將數組數存入一個變量中,並且退出循環
  • 最後,我會將x與原始數組進行比較以找出結果x的索引是在原始數組中

這似乎有很多工作要做,有沒有更簡單的解決方案?我的頭不旋轉那麼快

編輯 - 原始數組不以任何方式

EDIT 2排序 - 基本上,我有這個隨機數進行比較的排序的數組的麻煩。我需要的無序保持不變這就是爲什麼我在我的邏輯,生成新的數組

+1

測試它,你想做什麼? – pomeh

+0

找出生成的隨機數在哪裏屬於數組。這是一個旋轉器,我需要找到第一張幻燈片旋轉,偶然發現/重量。 – Huangism

+2

你能發表一些代碼嗎?可以幫助其他人看待問題。 – RubbleFord

回答

1

如果你有一個數組,其元素之和爲1,您可以使用下面的算法:

  1. 選擇一個均勻分佈式(pseuo)隨機數r,介於0和權重之和之間。
  2. 對於每個重量,
    • 如果r小於重量,選擇它並退出。
    • 否則從r中減去權重,所以它現在在0和剩餘權重的總和之間。

由於r總爲0,其餘的權重的總和之間,總是有正比於每個R小於它時,循環達到該重量的機會。

在JavaScript:

var weights = [0.5, 0.15, 0.3, 0.05]; 
var index = weights.length - 1; // Last by default to avoid rounding error. 
var r = Math.random(); 

for (var i = 0; i < a.length - 1; ++i) { 
    if (weights[i] > r) { index = i; break; } 
    // The rest of the array sums to 
    // 1 - sum(weights[0]..weights[i]) 
    // so rescale r appropriately. 
    r -= weights[i]; 
} 

會給你想要的分佈。

訣竅是r -=這使得確保r總是0和未處理的數組元素的總和之間。

您可以在http://jsfiddle.net/KdKdb/

+0

我不明白這個邏輯,你能解釋一下嗎? – Huangism

+0

@黃色,請看我的編輯。 –

+0

我不瞭解它,但我可以看到它是如何工作的,謝謝 – Huangism