संभावना का परीक्षण करने के लिए एक एल्गोरिदम पर विचार करें कि एक विशिष्ट संख्या को एक विशिष्ट संख्या के प्रयासों के बाद एन अद्वितीय संख्याओं के एक सेट से चुना जाता है (उदाहरण के लिए, एन = 2 के साथ, रूले (0 के बिना) में संभावना क्या है जो एक्स लेता है ब्लैक जीतने की कोशिश करता है?)।libc यादृच्छिक संख्या जेनरेटर त्रुटिपूर्ण?
इसके लिए सही वितरण पाउ (1-1/एन, एक्स -1) * (1/एन) है।
हालांकि, जब मैं निम्नलिखित कोड का उपयोग करके इसका परीक्षण करता हूं, तो एक्स = 31 में स्वतंत्र रूप से एन से स्वतंत्र रूप से बीज से एक गहरी खाई होती है।
क्या यह एक अंतर्निहित दोष है जिसे पीआरएनजी के कार्यान्वयन विनिर्देशों के उपयोग से रोका नहीं जा सकता है, क्या यह एक वास्तविक बग है, या क्या मैं कुछ स्पष्ट दिख रहा हूं?
// C
#include <sys/times.h>
#include <math.h>
#include <stdio.h>
int array[101];
void main(){
int nsamples=10000000;
double breakVal,diffVal;
int i,cnt;
// seed, but doesn't change anything
struct tms time;
srandom(times(&time));
// sample
for(i=0;i<nsamples;i++){
cnt=1;
do{
if((random()%36)==0) // break if 0 is chosen
break;
cnt++;
}while(cnt<100);
array[cnt]++;
}
// show distribution
for(i=1;i<100;i++){
breakVal=array[i]/(double)nsamples; // normalize
diffVal=breakVal-pow(1-1/36.,i-1)*1/36.; // difference to expected value
printf("%d %.12g %.12g\n",i,breakVal,diffVal);
}
}
पर परीक्षण किया गया एक अप-टू-डेट Xubuntu 12.10 libc6 पैकेज 2.15-0ubuntu20 और इंटेल कोर SandyBridge i5-2500 साथ है, लेकिन मैं एक पुराने Ubuntu मशीन पर कुछ साल पहले पहले से ही इस खोज की।
मैं भी Unity3D/मोनो (यकीन नहीं जो मोनो संस्करण है, हालांकि) का उपयोग कर विंडोज 7 पर इस परीक्षण किया है, और यहाँ खाई जब, System.Random का उपयोग करते समय एकता के builtin Unity.Random नहीं दिखाई खाई है एक्स = 55 पर होता है (कम से कम एक्स < 100 के लिए नहीं)।
वितरण:
मतभेद:
मुझे नहीं लगता कि कोई भी दावा करता है कि glibc में यादृच्छिक फ़ंक्शन विशेष रूप से "उच्च गुणवत्ता" है। यदि आप कुछ बेहतर चाहते हैं, तो मेर्सन ट्विस्टर या कुछ अन्य "पेशेवर ग्रेड" आरएनजी का उपयोग करें।सी पुस्तकालयों [और अन्य समान पुस्तकालयों] द्वारा आपूर्ति की गई एक सादगी के लिए लिखी जाती है, न कि "पूर्णता"। –
1) मुख्य int 2 वापस करना चाहिए) मॉड्यूल 36 संदिग्ध है, मेरा सुझाव है कि आप पहले मॉड्यूल 32, या दो की दूसरी शक्ति का प्रयास करें। – wildplasser
मैं मॉड्यूल 36 और 32 दोनों के लिए इस व्यवहार (डेबियन सिड) की पुष्टि कर सकता हूं। – liori