2016-11-22 142 views
3

我有一個叫myrand()的函數,它可以產生從1到5的隨機數。我想用另一個函數myrand()來產生1到7的隨機數。我寫了類似的東西。解決隨機數邏輯

function newrand() { 
    return myrand()+2; 
} 

上面的邏輯是不是我希望它永遠不會返回我1或2。我不希望使用任何if條件所以我應該怎麼做才能讓邏輯隨機數。

+0

爲什麼你想再次使用'myrand'? 'mt_rand(1,7)'不會更容易嗎? – roberto06

回答

1

在PHP中有一個名爲rand()的函數來執行此操作。試試下面的代碼:

function newrand() { 
    return rand(1, 7); 
} 

或者可以說,你的myrand()是這樣的下面的代碼:

function myrand() { return rand(1,5); } 

你可以做的是,通過UPPERLIMIT到myrand()myrand(5)myrand(7)而不是myrand() + 2。如下面:

myrand($max) { 
    return rand(1, $max); 
} 

,並調用它像這樣:

function newrand() { 
    return myrand(7); 
} 
+0

好....但是如果'newrand()'返回的數字與OP原始函數'myrand()'返回的數字相同呢?範圍是如此之小(從0到7),所以返回值完全相同的可能性更高......但Up +對於好主意,儘管...... – Poiz

+0

OP顯然要求隨機數。 –

+1

這就是爲什麼你得到Up + ....但是,你可以考慮重複 - 雖然OP沒有明確要求它......如果他想要重複,他會使用相同的號碼返回通過他的'myrand()'功能.... **簡而言之,你是對的.. **。但***你可以只添加額外的邏輯 - 如果你願意*** – Poiz

0

當你寫某種rand()功能,最好想想二進制數表示的不僅僅是常規的數字。

例如,要獲得範圍從0到7的隨機數,您必須得到3位的均等分佈。

000 # 0 
001 # 1 
010 # 2 
... 
111 # 7 

如果可以考慮你myrand()爲從1產生的數字至5以相等的概率,則可以通過組合由myrand()呼叫產生第一個2位構造任何rand()功能的功能。

func rand_bits_2() { return (myrand() - 1) & 0b11; } 

func rand_bits_4() { 
    hi = rand_bits_2() << 2; // first 2 random bits 
    lo = rand_bits_2();  // consecutive 2 random bits 
    return hi | lo; 
} 

和4個隨機位從0到15的數字製作以這樣的想法,你還可以得到例如myrand7()

UPD:您可以找到更多here

+0

一個明亮而獨特的方法,但仍然有點**重人** SO聲譽小於70,並且仍在努力使用標準的PHP rand()函數,甚至可能對***低級別位操作***甚至沒有絲毫知識......但對那些熱衷於探索異常的遊客......或***非傳統***如果您願意**: - )** – Poiz

0

讓我們假設你的函數統一生成15之間的數字。均勻地產生17之間的數字做到以下幾點:

  1. 生成7隨機數

    X1 ...X7

15之間

使用功能

  • 計算樣品的總和

    S = X1 + X2 + ... + x7

  • 返回

    (S - 7 MOD 7)+ 1

  • 其中(s - 7 mod 7)是通過7s - 7的整數除法的非負提醒。


    這裏是我生成100000樣品重複上述這樣的次數的3個步驟後剛剛獲得的隨機頻率的一個示例:

    1 -> 14331 
    2 -> 14447 
    3 -> 14489 
    4 -> 14095 
    5 -> 14293 
    6 -> 14157 
    7 -> 14188 
    

    其中,因爲你可以看到,清楚地看起來均勻。