我可以用這個產生在C兩個數字之間的隨機數..生成隨機數之間有兩個號碼與一個難得的數量
arc4random()%(high-low+1)+low;
那麼現在我的要求。我想作出一些罕見的。 ...這就是意味着,如果
高= 5, 低= 1, 和稀有= 3,
比3會出現很多很少超過1,2,4和5 ...
感謝
我可以用這個產生在C兩個數字之間的隨機數..生成隨機數之間有兩個號碼與一個難得的數量
arc4random()%(high-low+1)+low;
那麼現在我的要求。我想作出一些罕見的。 ...這就是意味着,如果
高= 5, 低= 1, 和稀有= 3,
比3會出現很多很少超過1,2,4和5 ...
感謝
您可以使用表格來計算你的最終卷,類似於筆和紙的RPG遊戲是如何做到這一點同類型的計算:
卷1 d 21(易可能的W /代碼)。
的優勢,這個選擇是你得到你是準確的概率感很強處理。您可以感受到每個數字的稀少或普遍性,並且與其他數字相比,您可以更細緻地控制每個數字的普遍程度。
您也可以使用分數來生成表格。使用Least Common Multiple來確定一個公共基礎。該基地是您將需要的最大隨機數字大小。然後,將所有分數用相似的術語表示。使用結果分子來確定表中每個數字的範圍大小。
有了這個自動化的解決方案,輸入數字相互之間很容易理解。 E.G:
這將生成如下表格:
LCM = 20
一個簡單易懂的選項:
還有其他的替代方法,只需要您生成一個單一的數字,但上面的感覺就像它是最簡單的編寫和理解。
你不需要在第二步重複生成數字,只需將範圍減少一個,如果隨機數> =稀有數字,則將其增加。 – Skizz 2010-10-19 09:32:22
@Skizz:你當然可以做到這一點,是的。這會更有效率。我認爲這需要更多的大腦循環,而不僅僅是重複 - 至少對我來說 - 但它仍然是一個好主意。 – 2010-10-19 10:02:25
你可以根據自己的概率創建包含號碼的數組:
list = (1, 1, 2, 2, 3, 4, 4, 5, 5);
return list.itemAtIndex(random() % list.count());
這不是很優雅,但它的工作原理和容易縮放,如果概率變得更復雜。
+1;這是實施上述解決方案的一種方式,如果存儲容量不足,不需要擔心,或者是與CPU時間的良好折衷 – 2010-10-19 09:40:25
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.現在我們在這裏以離散概率在有限範圍內工作,所以我們在(有)一些分佈的情況下查看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到1.0之間生成),並且每個結果類型只需要存儲一個值。 – 2010-10-19 10:10:31
這是優雅的,但需要雙擊和二進制搜索通過一組截斷值。不是世界末日,而是表現考慮。另一種方式是雙打比較好 - 比Merlyn的方法的常見多重計算更易於設置和理解。 – 2010-10-19 12:16:18
是的,它會比較慢,更快的方法是創建一個靜態表。也許我們在靜態表中有256個值,每個值都包含一個從1到5的數字,然後從0到255中選擇一個隨機數,然後在表中查找與它相關的值。 – CashCow 2010-10-20 09:00:42
讓我們通過這個。首先我們使用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;
}
我敢打賭,這傢伙適用於網上賭場:) – Joony 2010-10-19 09:29:30
NOP ...我的比賽3益智工作.. – Rony 2010-10-19 09:42:07
您還可能有興趣在gamedev.stackexchange.com :) – badp 2010-10-19 09:47:35