什麼是php shuffle函數使用的算法,或者我可以在哪裏獲得它的代碼。我必須用C語言來實現它。我已經在C中實現了fisher yates算法,但是php洗牌功能顯示的結果並不好。PHP shuffle函數使用的算法
1
A
回答
5
什麼構成「不好的結果」?
Fisher-Yates shuffle將以相同的概率產生所有排列,但只有當您正確生成隨機數。這裏需要注意三個問題。首先,你需要一個好的僞隨機數發生器。 C標準庫rand
通常是而不是一個很好的PRNG(儘管它取決於你的C庫實現)。如果您使用的是POSIX平臺,請考慮使用lrand48
。您的系統可能有其他RNG。如果您的平臺上沒有任何東西,那麼G.Magaglias KISS生成器 - 代碼非常少,您可以找到代碼here。其次,如果您仍然決定使用rand
,請注意它會生成0到RAND_MAX
之間的隨機數字。對於大量的實現,RAND_MAX
只是32767,所以如果count
大於32768,通常的rand() % count
將會有非常明顯和不良的偏見。第三,rand() % count
(或lrand48() % count
或類似的)實際上也是一個壞主意,因爲它也引入了偏見。如果count
不是2的冪,那麼某些數字的概率將高於其他數字。而且,在很多發生器中,低位比隨機高位少得多。你可以嘗試使用(long long) rand() * count/RAND_MAX
或類似的東西來解決這個問題,但是你真的更喜歡使用一個好的RNG。
生成0(含)和k
(不包括)之間的無偏隨機數的正確方法是:首先,獲得一個適當的PRNG,爲您提供足夠大的隨機數(例如32個隨機數)。然後減小到大於k
的下一個2的冪。最後,如果該值大於或等於k
,請重試。這是一個完全沒有偏見的方法,並且會給出和PRNG一樣好的結果。代碼看起來像這樣:
static unsigned int random(unsigned int k)
{
// You can get rid of this loop using bit tricks, but I keep it for clarity
unsigned int n, nextpow2 = 1;
while (nextpow2 < k)
nextpow2 *= 2;
do {
n = random32() & (nextpow2 - 1); // random32 is your 32-bit RNG
} while (n >= k);
return n;
}
相關問題
- 1. Word shuffle算法(PHP或javascript)
- 2. Lazy Shuffle算法
- 3. Fisher-Yates shuffle算法
- 4. 在並行計算中使用rng('shuffle')函數
- 5. PHP crypt函數和算法
- 6. PHP shuffle數組並記住
- 7. 使用&運算符的PHP函數
- 8. PHP Shuffle Multiple Decks
- 9. 通過使用函數聲明rng('shuffle','twister')多次降低計算時間
- 10. 在javascript中使用shuffle算法跟蹤索引
- 11. 無法使用PHP函數
- 12. 重載CUDA shuffle函數使得原始函數不可見
- 13. 不使用內置PHP函數的簡單算法?
- 14. PHP函數的算法複雜度strlen()
- 15. SystemVerilog數組隨機種子Shuffle函數
- 16. shuffle array in class php
- 17. 算法使用PHP
- 18. 爲什麼shuffle函數不能在PHP類中工作?
- 19. PHP重寫密碼散列函數使用什麼算法?
- 20. PHP計算函數
- 21. PHP shuffle在我的嵌套數組上無法正常工作
- 22. 在RK4算法中使用lambda函數
- 23. rnorm函數使用哪種算法
- 24. 爲什麼我無法在PHP中使用shuffle正確地洗牌數組?
- 25. 使用PHP計算小數位數的函數
- 26. PHP ob_函數的用法
- 27. 如何獲取codeigniter中函數shuffle的確切值?
- 28. php mysql shuffle輸出速度
- 29. PHP shuffle,多重循環
- 30. PHP單線陣列shuffle不起作用
感謝您的信息。該算法現在運行良好。 – cooldude 2010-11-16 08:20:52