2008-08-08 12 views
17

मुझे पता है कि rand() का उपयोग करके अनुमान लगाया जा सकता है, अगर आप जानते हैं कि आप क्या कर रहे हैं, और सर्वर तक पहुंच है।बेहतर यादृच्छिक जनरेटिंग PHP

मेरे पास एक परियोजना है जो अत्यधिक एक यादृच्छिक संख्या चुनने पर निर्भर है जो संभवतः अप्रत्याशित है। तो मैं सुझावों की तलाश में हूं, या तो अन्य अंतर्निर्मित फ़ंक्शंस या उपयोगकर्ता फ़ंक्शन, जो बेहतर यादृच्छिक संख्या उत्पन्न कर सकते हैं।

मैं इस प्रयोग किया जाता है एक छोटे से परीक्षण करना:

$i = 0; 

while($i < 10000){ 
    $rand = rand(0, 100); 

    if(!isset($array[$rand])){ 
     $array[$rand] = 1; 
    } else { 
     $array[$rand]++; 
    } 

    sort($array); 
    $i++; 
} 

मैंने पाया परिणाम समान रूप से वितरित किया जाना है, और कई बार प्रत्येक संख्या उत्पन्न होता है की संख्या के एक अजीब पैटर्न है।

+0

php7 में एक नया फ़ंक्शन है, जो [आपको वही करता है] (http://stackoverflow.com/a/31444887/1090562)। –

उत्तर

21

खराब यादृच्छिक स्रोत जोड़ने, गुणा करने या छेड़छाड़ करने से आपको एक खराब यादृच्छिक परिणाम मिलेगा। स्पष्टीकरण के लिए Introduction to Randomness and Random Numbers देखें।

आप PHP rand() फ़ंक्शन के बारे में सही हैं। एक हड़ताली चित्रण के लिए Statistical Analysis पर दूसरा आंकड़ा देखें। (पहला आंकड़ा हड़ताली है, लेकिन इसे स्कॉट एडम्स द्वारा खींचा गया है, जो रैंड() के साथ प्लॉट नहीं किया गया है)।

एक समाधान एक वास्तविक यादृच्छिक जनरेटर जैसे random.org का उपयोग करना है। एक और, यदि आप लिनक्स/बीएसडी/आदि पर हैं। /dev/random का उपयोग करना है। यदि यादृच्छिकता मिशन महत्वपूर्ण है, तो आपको hardware random generator का उपयोग करना होगा।

3

रैप के लिए बीज के रूप में EPOCH के बाद मिलीसेकंड का उपयोग करके @ केजी पर भिन्नता?

+0

सोयू, आज के तेज़ बहु-कोर कंप्यूटर के साथ, आपके पास बीज का दोबारा उपयोग करने का एक बहुत अच्छा मौका है, कई बार? ह्यूमनस रेड फ्लैग - आप स्क्वायर व्हील को फिर से शुरू कर रहे हैं, यहां तक ​​कि 'srand()' के साथ कोई तर्क नहीं है ("अधिक यादृच्छिक") नौकरी। – Piskvor

5

random.org में एक एपीआई है जिसे आप HTTP के माध्यम से एक्सेस कर सकते हैं।

RANDOM.ORG एक वास्तविक यादृच्छिक संख्या सेवा है जो वायुमंडलीय शोर के माध्यम से यादृच्छिकता उत्पन्न करती है।

4

मैं यादृच्छिकता की छाप से सावधान रहूंगा: ऐसे कई प्रयोग हुए हैं जहां लोग कम यादृच्छिक वितरण चुनेंगे। ऐसा लगता है कि मनोदशा पैदा करने या अनुमान लगाने में मन बहुत अच्छा नहीं है।

Fourmilab पर यादृच्छिकता पर अच्छे लेख हैं, जिसमें true random generator शामिल हैं। हो सकता है कि आप दोनों साइटों से यादृच्छिक डेटा प्राप्त कर सकें ताकि यदि कोई नीचे है तो आपके पास अभी भी दूसरा है।

फोरमिलाब यादृच्छिकता की जांच के लिए test program भी प्रदान करता है। आप अपने विभिन्न myRand() प्रोग्रामों की जांच के लिए इसका उपयोग कर सकते हैं।

अपने अंतिम कार्यक्रम के लिए, यदि आप 10000 मूल्य उत्पन्न करते हैं, तो आप 10 हजार के बीच अंतिम मूल्य क्यों नहीं चुनते? आप स्वयं को सबसेट में प्रतिबंधित करते हैं। साथ ही, यह काम नहीं करेगा यदि आपका $ मिनट और $ अधिकतम 10000 से अधिक है।

वैसे भी, आपको आवश्यक यादृच्छिकता आपके आवेदन पर निर्भर करती है। रैंड() एक ऑनलाइन गेम के लिए ठीक रहेगा, लेकिन क्रिप्टोग्राफी के लिए ठीक नहीं है (सांख्यिकीय कार्यक्रमों के साथ पूरी तरह से परीक्षण नहीं किया गया है, वैसे भी क्रिप्टोग्राफी के लिए उपयुक्त नहीं होगा)। आप ही फैन्सला करें!

2

हो रही UUID

पीएचपी संस्करण 5 करने के लिए यादृच्छिक संख्या, अवधारणा में इसी तरह के होने का एक और तरीका है।3 और ऊपर

openssl_random_pseudo_bytes(...) 

या आप RFC4122 का उपयोग कर निम्नलिखित library कोशिश कर सकते हैं

1

एक नया PHP7 वहाँ एक समारोह करता है कि आप वास्तव में क्या जरूरत है: यह उत्पन्न करता है cryptographically secure pseudo-random integers.

int random_int (int $min , int $max) 

उत्पन्न करता है क्रिप्टोग्राफिक यादृच्छिक पूर्णांक जो उपयोग के लिए उपयुक्त हैं जहां निष्पक्ष परिणाम महत्वपूर्ण हैं (यानी पोकर डेक को शफल करना)।

PRNG और CSPRNG (और उनके अंतर) के बारे में अधिक विस्तृत विवरण के लिए के रूप में अच्छी क्यों अपने मूल दृष्टिकोण वास्तव में एक बुरा विचार है, कृपया मेरी another highly similar answer पढ़ें।

संबंधित मुद्दे