2012-04-12 106 views
1

我試圖生成一個範圍從-1到6的隨機數,但每次我生成一個隨機數的概率獲得範圍內的數字是由一個百分比給出。例如,在百分比列表中,第一個百分比具有生成6的概率,第二個百分比具有生成5的概率,以此類推。數字必須隨機生成。我試圖用C編寫這個代碼。謝謝你的想法。如何生成一個範圍內的隨機數給定的概率獲得其中一個數

+0

致VTC-ers。這實際上是一個很常見的事情(與本地化相反),雖然它有點複雜的描述。 – bitmask 2012-04-12 20:28:07

回答

4

您可以得到一個介於0到100之間的隨機數,並檢查落入的百分比範圍併爲其分配相應的值。

例如:

0 - 5 : -1 
    5 - 25 : 0 
    25 - 31: 1 
    31 - 48: 2 
    48 - 50: 3 
    50 - 75: 4 
    75 - 87: 5 
    87 - 100: 6 

編輯:

爲了實現這一點,你將需要一個或兩個陣列,一個存儲該百分比邊界(意味着5,25,31,48,50 ,在這種情況下爲75,87)和另一個存儲輸出值的數組(如果輸出是完全隨機的,在這裏它們是連續的,你不需要第二個數組)。
然後你打電話rand() * 100.0/RAND_MAX得到0和100之間rand() % 100 + 1隨機浮動爲0和100

之間的隨機INT有了這個,你可以使用二進制搜索方法來查找百分比範圍這相當於爲O (log n)時間。隨着指數你找到相應的輸出(通過一個數組或功能)

+0

我其實做了這樣的事情,但我教我做錯了..但謝謝澄清它對我 – user1319817 2012-04-12 20:29:55

0

我敢肯定還有其他的,可能會更好,這樣做的方法,但想到什麼是這樣的:創建一個包含適當的數組根據你的百分比,每個數字的副本(-1到6)。然後在數組中隨機選取一個元素。

+0

這項工作,如果百分比是整數,百分比如0.5%,這將無法正常工作 – SirGuy 2012-04-12 20:28:33

1

這是一項家庭作業嗎?我將不承擔,對於具有對人類的信念的緣故)

所以我的意思是,你所有的百分比應爲100對不對? 您可以生成一個介於0和100之間的數字,並查看它落入哪個支架。

即如果您的百分數都是[10,20,35,15,10,10]

然後,第一托架是 「< 10」,所以在10產生的任何數目yeilds 6

x < 10 --> 6 
10 <= x < (10+20) --> 5 
(10+20) <= x < (10+20+35) --> 4 
(10+20+35) <= x < (10+20+35+15) --> 3 

等。您希望生成1到100之間的隨機浮點數以滿足例如11.9的精度百分比。

+0

不,它不是一個家務任務;)我只是試圖做一個簡單的基於文本的遊戲。感謝您的輸入:) – user1319817 2012-04-12 20:34:13

0

我認爲這樣做最簡單的方法是考慮下面的比喻:如果你有一個線[0,1],可以認爲產生從1到4等同於分裂

S_1 = [0,1/4],S_2 = [1/4,2/4],S_3 = [2/4,3/4],S_4 = [3/4,1]。這樣,當你從[0,1]生成一個數字時,如果它落在S_i段上,生成的數字就是i。

如果您想要分配不同的概率每個號碼,說P_I,他們你只需要劃分不同大小的段,用P_I根據。

例如,對於1 P_1 = 0.1,2 P_2 = 0.4,3 P_3 = 0.2和4 P_4 = 0。3可以使用S_1 = [0,p_1],S_2 = [p_1,p_1 + p_2],S_3 = [p_1 + p_2,p_1 + p_2 + p_3]和S_4 = [p_1 + p_2 + p_3,p_1 + p_2 + p_3 + p_4]

然後你在[0,1]上生成一個統一的隨機數,並測試它是否落在S_i中。

+0

您有一個好點。這與我的解決方案非常相似,但範圍實際上可以在任何範圍內使用,我想,只要比率是正確的。如果您的百分比和隨機數生成器已經在該範圍內,則設置範圍在0到1之間非常好。 – mltsy 2012-04-12 20:36:48

1

製作一個數組有100個元素,用-1到6填充它取決於每個需要的重量。例如,如果您需要-1來命中15%,則可以用-1來填充15個元素。 現在生成一個從1到100的隨機數,只需查看數組,就可以得到實際的結果加權。

+0

不適用於小數百分比,比如0.5% – SirGuy 2012-04-12 21:10:48

+0

,因爲他正在進行文本基礎遊戲,我認爲整數百分比就足夠了,除非他另有說明。這也應該爲高頻率使用提供良好的性能。 – pizza 2012-04-12 21:34:44

+0

同意,我不是說你的方法是無效的,只是有一個警告 – SirGuy 2012-04-12 22:28:23

相關問題