2012-06-26 11 views
5

हम समझाने दें कि मेरा क्या मतलब है।क्या रैड() समय-php में निर्भर है?

कुछ समय पहले, जबकि सी # में एक प्रोग्राम लिखने, मैं कर दिया है निम्नलिखित गलती:

int Randomize() 
{ 
    Random r=new Random(); 
    return r.Next(0,10); 
} 
सी # में

, यह एक गलती है, क्योंकि, एक पंक्ति में कई बार कहा जाता है, इस समारोह वापस आ जाएगी वही मूल्य ऐसा इसलिए है क्योंकि रैंडम कन्स्ट्रक्टर समय बीज का उपयोग करता है, और कॉल के बीच का समय अंतर बहुत कम था (मुझे यह पता लगाने में एक घंटा लगा :) :)।

अब मैं PHP में rand(...) का उपयोग कर रहा हूं, और मुझे आउटपुट हमेशा अलग होने की आवश्यकता है, भले ही 2 स्क्रिप्ट एक ही समय में निष्पादित हों।

क्या मुझे यह परिणाम प्राप्त करने के लिए कुछ करना है, या इसे इस तरह से काम करने के लिए डिज़ाइन किया गया है?

+0

बस इसे काम करने दें, हालांकि mt_rand() रैंड() –

+0

से बेहतर है।मैं इसे विशेष रूप से विस्तार से उत्तर नहीं दे सकता, लेकिन इन दिनों पसंद के स्वीकृत पीआरएनजी 'mt_rand' है, न कि' रैंड '। – deceze

+0

अच्छा है लेकिन मुझे लगता है कि आपके मामले में आउटपुट अलग होना सुनिश्चित करना मुश्किल है, भले ही दो स्क्रिप्ट एक ही समय में निष्पादित की जाए, –

उत्तर

9

rand() और mt_rand()srand() और mt_srand() हमेशा यादृच्छिक परिणाम उत्पन्न करने के लिए कॉल करता है।

ध्यान दें कि स्वचालित बोने आप एक तेजी से सर्वर पर कई रन देकर एक ही परिणाम प्राप्त कर सकते हैं जिसका मतलब है कि सेकंड की वर्तमान संख्या के साथ किया जा रहा है: लेकिन यहाँ php.net पर कोई रोचक पोस्ट है। या तो अपने आप को अक्सर बदलते बीज या mt_rand() का उपयोग करें, जो पर दिखाई नहीं देता है, समस्या से पीड़ित है।

तो, बस srand अधिक बार या mt_rand पर कॉल करें।

+1

है, हालांकि PHP नहीं है, लेकिन अभी भी एक अच्छा पठन है कि स्वचालित बीजिंग शायद सबसे अच्छा तरीका क्यों नहीं है। http://baagoe.com/en/RandomMusings/javascript/ – Yoshi

3

बारे mt_rand() समारोह ...

http://php.net/manual/en/function.mt-srand.php

पीएचपी 4.2.0 के रूप में से, वहाँ) srand साथ यादृच्छिक संख्या जनरेटर (या mt_srand() बीज के रूप में यह है कोई जरूरत नहीं है अब स्वचालित रूप से किया।

(PHP 5.2.1 के लिए) PHP में मेर्सन ट्विस्टर कार्यान्वयन अब रिचर्ड वाग्नेर द्वारा एक नए बीजिंग एल्गोरिदम का उपयोग करता है। समान बीज अब पिछले संस्करणों में किए गए मानों के समान अनुक्रम का उत्पादन नहीं करते हैं। इस व्यवहार को फिर से बदलने की उम्मीद नहीं है, लेकिन फिर भी इसे भरोसा करने के लिए असुरक्षित माना जाता है।

यहाँ link है, "Mersenne ट्विस्टर (एमटी)" कूट-यादृच्छिक संख्या उत्पन्न एल्गोरिथ्म (और सी में implementations, सी ++, सी #)

Here आप में इस समारोह के कार्यान्वयन पा सकते हैं के विवरण के साथ PHP 5

और php_rand.h में मैं इस पाया:

#ifdef PHP_WIN32 
#define GENERATE_SEED() (((long) (time(0) * GetCurrentProcessId()))^((long) (1000000.0 * php_combined_lcg(TSRMLS_C)))) 
#else 
#define GENERATE_SEED() (((long) (time(0) * getpid()))^((long) (1000000.0 * php_combined_lcg(TSRMLS_C)))) 
#endif 

तो अब आप देख सकते हैं कि PHP में यादृच्छिक कार्य time फ़ंक्शन पर निर्भर करता है ...

+0

भी 'lcg.c' देखें। यह समय पर निर्भर करता है ** एक बार ** यदि यह पहले से ही बीजित नहीं है। परिभाषा के अनुसार एलसीजी प्रत्येक कॉल के बाद एक नया यादृच्छिक मूल्य उत्पन्न करेगा, और यह प्रत्येक कॉल के लिए समय समारोह पर निर्भर नहीं है। – Leigh

+0

@Leigh, वास्तव में। मैं उस बिंदु से चूक गया। धन्यवाद। –

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