2013-03-26 172 views
1

我在爲我的問題考慮算法時遇到了一些麻煩。我會盡力解釋我能做到的最好。這只是一個例子。算法需要幫助

所以說1000個人中的3%點擊了一個鏈接。

所以我需要一個算法,可以在1000個視圖中隨機分佈點擊。

它很容易均勻分佈,例如:1000 * .03 = 30,因此每30個視圖有人會點擊一個鏈接。

EG:

For (i = 0; i<1000; i++) { 
if(i % 30 == 0); 
click() 
} 
+0

點擊發生在任何特定視圖上的概率是多少?你將如何生成一個隨機二元變量,其概率是1? – 2013-03-26 23:37:03

+1

您希望結果的期望值爲1000的3%,還是爲3%? – 2013-03-26 23:38:43

+0

這將是任何數量的3%。 – Jedigasm 2013-03-26 23:39:38

回答

1
List<Boolean> wasclicked = new ArrayList<Boolean>(); 
for (int i = 0; i < NUM_CLICKS * 0.03; i++) { 
    wasclicked.add(true); 
} 
for (int i = 0; i < NUM_CLICKS * 0.97; i++) { 
    wasclicked.add(false) 
} 
Collections.shuffle(wasclicked); 

你現在有一個隨機的布爾值列表,其中3%是正確的。

+1

確切地說,可能不一定是因爲四捨五入。 – 2013-03-26 23:46:11

+0

哦。是的,這是真的。如果'NUM_CLICKS * 0.03'或'NUM_CLICKS * 0.97'不是一個整數,則需要考慮這一點。 – 2013-03-26 23:47:30

2

您還可以創建1000個整數數組,初始化它們的30比1,其餘970至0,然後shuffle數組隨機使用array[index from 0 to 999],看的點擊需要。

+0

這是一個不錯的主意,但不確定它是否可以很好地處理大數量,例如100,000。 – Jedigasm 2013-03-26 23:40:37

4

您是否需要實際30次點擊或者只是一個統計分佈,平均每1000次提供30次點擊?如果統計分佈是你需要的,那麼就做if (Math.random() < 0.03)。如果您只需要30次點擊,那麼最簡單的方法是選擇0到999之間的30個隨機數,確保沒有重複項,然後單擊這些索引。