2008-11-13 112 views
1

我需要一些關於隨機性算法的幫助。所以問題是。隨機性算法

在8個小時的時間內將發生50個事件。事件可以隨機發生。 現在它意味着在每秒鐘內有事件發生的機會是50 /(8 * 60 * 60)= .001736。 如何用隨機生成算法做到這一點?

我可以得到隨機數

int r = rand(); 
double chance = r/RAND_MAX; 
if(chance < 0.001736) 
    then event happens 
else 
    no event 

但大部分時間蘭特()返回0和0 < 0.001736,比需要我得到更多的事件。

有什麼建議嗎?


抱歉,我忘記提及 餘計算的機會,因爲 雙機會=(的static_cast)(R)/(的static_cast)(RAND_MAX);


它可以除去從的static_cast

雙機會=(雙)R /(雙)(RAND_MAX)雙;

+0

這將有助於瞭解你所使用的語言和蘭特庫。 – 2008-11-13 20:00:19

+0

這個問題的標題可能會更具描述性。 – 2008-11-13 20:13:41

回答

2
  • 創建一個50個數字的列表。
  • 與他們

和你有50秒之間1和8 * 60 * 60

  • 排序隨機數填充。

    請注意,您可以重複。

  • +0

    這看起來不錯,但我不認爲有任何需要排序... – anand 2008-11-13 22:53:35

    7

    兩個rRAND_MAX是整數,所以表達式

    double chance = r/RAND_MAX; 
    

    計算與整數運算。請嘗試:

    double chance = 1.0 * r/RAND_MAX; 
    

    這將導致該部門成爲浮點部門。

    但是,更好的解決方案是使用隨機函數,首先返回浮點值。如果您使用整數隨機數生成器,您的概率計算中會出現一些偏差錯誤。

    7

    如果您選擇某個事件是否會在每秒發生,則發生0個事件或發生8 * 60 * 60個事件。如果50個事件是約束條件,則在8小時內選擇50個隨機時間並存儲它們。

    0

    爲什麼不創建一個28,800元素列表並從中拉出50個元素來確定事件的時間?這確實假設2個事件不能同時發生,每個事件需要1秒的時間。您可以使用隨機數生成器生成0到x之間的整數值,以便可以在限制範圍內進行選取。

    2

    究竟是50,還是平均50?

    您可能需要查看Exponential distribution並找到支持它的語言庫。

    指數分佈將給出以指定平均速率隨機出現的事件之間的時間間隔。

    你可以「假」,它具有均勻的RNG如下:

    double u; 
        do 
        { 
         // Get a uniformally-distributed random double between 
         // zero (inclusive) and 1 (exclusive) 
         u = rng.nextDouble(); 
        } while (u == 0d); // Reject zero, u must be +ve for this to work. 
        return (-Math.log(u))/rate;