2010-10-19 95 views
11

我可以用這個產生在C兩個數字之間的隨機數..生成隨機數之間有兩個號碼與一個難得的數量

arc4random()%(high-low+1)+low; 

那麼現在我的要求。我想作出一些罕見的。 ...這就是意味着,如果

高= 5, 低= 1, 和稀有= 3,

比3會出現很多很少超過1,2,4和5 ...

感謝

+9

我敢打賭,這傢伙適用於網上賭場:) – Joony 2010-10-19 09:29:30

+0

NOP ...我的比賽3益智工作.. – Rony 2010-10-19 09:42:07

+1

您還可能有興趣在gamedev.stackexchange.com :) – badp 2010-10-19 09:47:35

回答

26

您可以使用表格來計算你的最終卷,類似於筆和紙的RPG遊戲是如何做到這一點同類型的計算:

卷1 d 21(易可能的W /代碼)。

  • 如果你得到1-5,則會被計爲1
  • 如果你得到6-10,則會被計爲2
  • 如果你得到11-15,則會被計爲4
  • 如果你得到16-20,則會被計爲5
  • 如果你得到一個21,則會被計爲3

的優勢,這個選擇是你得到你是準確的概率感很強處理。您可以感受到每個數字的稀少或普遍性,並且與其他數字相比,您可以更細緻地控制每個數字的普遍程度。

您也可以使用分數來生成表格。使用Least Common Multiple來確定一個公共基礎。該基地是您將需要的最大隨機數字大小。然後,將所有分數用相似的術語表示。使用結果分子來確定表中每個數字的範圍大小。

有了這個自動化的解決方案,輸入數字相互之間很容易理解。 E.G:

  • 1/4 1
  • 1/4 2
  • 1/4 4
  • 1/5 5
  • 1/20 3

這將生成如下表格:

LCM = 20

  • 1-5 = 1(類似術語 - 5/20)
  • 6-10 = 2(5/20)
  • 11-15 = 4(5/20)
  • 16-19 = 5(4/20)
  • 20 =(1/20)

一些更上LCM:http://en.wikipedia.org/wiki/Least_common_multiple

11

一個簡單易懂的選項:

  • 生成一個號碼,以確定您是否打算返回稀有號碼(例如生成一個範圍在[0-99]內的數字,如果爲0,則返回罕見數字
  • 如果您到達此步驟,則返回一個非罕見數字:繼續在正常範圍內生成數字,直到您得到任何非罕見的數字,並返回

還有其他的替代方法,只需要您生成一個單一的數字,但上面的感覺就像它是最簡單的編寫和理解。

+4

你不需要在第二步重複生成數字,只需將範圍減少一個,如果隨機數> =稀有數字,則將其增加。 – Skizz 2010-10-19 09:32:22

+0

@Skizz:你當然可以做到這一點,是的。這會更有效率。我認爲這需要更多的大腦循環,而不僅僅是重複 - 至少對我來說 - 但它仍然是一個好主意。 – 2010-10-19 10:02:25

5

你可以根據自己的概率創建包含號碼的數組:

list = (1, 1, 2, 2, 3, 4, 4, 5, 5); 
return list.itemAtIndex(random() % list.count()); 

這不是很優雅,但它的工作原理和容易縮放,如果概率變得更復雜。

+0

+1;這是實施上述解決方案的一種方式,如果存儲容量不足,不需要擔心,或者是與CPU時間的良好折衷 – 2010-10-19 09:40:25

0
while true 
    generate a random number 
     if it's not the rare number, return it 
    generate a second random number - say from 1 to 100 
    if that second number's <= the percentage chance of the rare number compared to the others, return the rare number 

注意:這是快速的普通情況下或返回非罕見的數字。

1

所有概率之和必須爲1.現在我們在這裏以離散概率在有限範圍內工作,所以我們在(有)一些分佈的情況下查看5個可能性,稱它們爲p1,p2,p3,p4和P5其中之和爲1

F0 = 0 F1 = P1 F2 = F1 + P2 F3 = F2 + P3 F4 = F3 + P4 F5 = F4 + p5和必須爲1

生成一個從0到1的隨機數,我們將假設它不能完全是1.查看適合其上限的f值,這是你的隨機事件。因此,也許

F1 = 0.222 F2 = 0.444 F3 = 0.555 F4 = 0.777 F5 = 1

如果你的隨機數0.645,那麼你已經產生了4事件。 有了以上,你的生成一個3的機會就比其他任何機會少一半。我們可以把它不太可能是,如:

F1 = 0.24 F2 = 0.48 F3 = 0.52 F4 = 0.76 F5 = 1

0.24可能是別人的,只有0.04 3

+0

此解決方案看起來很有前景,但您的解釋很混亂。你能解釋一下你確定選擇哪個值的方法嗎?我喜歡這個答案的原因是你最小化了涉及的計算(隨機值總是在0.0到1.0之間生成),並且每個結果類型只需要存儲一個值。 – 2010-10-19 10:10:31

+0

這是優雅的,但需要雙擊和二進制搜索通過一組截斷值。不是世界末日,而是表現考慮。另一種方式是雙打比較好 - 比Merlyn的方法的常見多重計算更易於設置和理解。 – 2010-10-19 12:16:18

+0

是的,它會比較慢,更快的方法是創建一個靜態表。也許我們在靜態表中有256個值,每個值都包含一個從1到5的數字,然後從0到255中選擇一個隨機數,然後在表中查找與它相關的值。 – CashCow 2010-10-20 09:00:42

1

讓我們通過這個。首先我們使用srand()函數爲隨機數發生器播種。基本上,計算機可以根據提供給srand()的數字生成隨機數。如果您給出相同的種子值,則每次都會生成相同的隨機數。

因此,我們必須爲隨機數生成一個始終在變化的值。我們通過用time()函數將當前時間的值提供給它。

現在,當我們調用rand()時,每次都會產生一個新的隨機數。

#include<stdio.h> 
int random_number(int min_num, int max_num); 

int main(void) { 
    printf("Min : 1 Max : 30 %d\n",random_number(0,5)); 
    printf("Min : 100 Max : 1000 %d\n",random_number(100,1000)); 
    return 0; 
} 

int random_number(int min_num, int max_num) 
{ 
    int result=0,low_num=0,hi_num=0; 
    if(min_num<max_num) 
    { 
     low_num=min_num; 
     hi_num=max_num+1; // this is done to include max_num in output. 
    }else{ 
     low_num=max_num+1;// this is done to include max_num in output. 
     hi_num=min_num; 
    } 

    srand(time(NULL)); 
    result = (rand()%(hi_num-low_num))+low_num; 
    return result; 
} 
相關問題