में सबसे संभावित बिट्स मैंने इस तरह के प्रयोग किए हैं - सी और सी # से 10 मिलियन यादृच्छिक संख्याएं बनाई हैं। और फिर गिनती है कि यादृच्छिक पूर्णांक में 15 बिट्स से प्रत्येक बिट कितनी बार सेट है। (मैंने 15 बिट्स चुना क्योंकि सी केवल 0x7fff
तक यादृच्छिक पूर्णांक का समर्थन करता है)।यादृच्छिक पूर्णांक
मैं क्या मिल गया है यह है:
मैं दो प्रश्न:
क्यों 3 सबसे संभावित बिट्स कर रहे हैं?
C
मामले बिट्स8,10,12
में सबसे अधिक संभावना है। औरC#
बिट्स6,8,11
सबसे संभावित हैं।यह भी लगता है कि सी # सबसे संभावित बिट्स अधिकतर सी सबसे अधिक संभावित बिट्स की तुलना में 2 पदों से स्थानांतरित हो जाती हैं। ऐसा क्यों है ? क्योंकि सी # अन्य RAND_MAX निरंतर उपयोग करता है या क्या?
C
के लिए मेरे परीक्षण कोड:
void accumulateResults(int random, int bitSet[15]) {
int i;
int isBitSet;
for (i=0; i < 15; i++) {
isBitSet = ((random & (1<<i)) != 0);
bitSet[i] += isBitSet;
}
}
int main() {
int i;
int bitSet[15] = {0};
int times = 10000000;
srand(0);
for (i=0; i < times; i++) {
accumulateResults(rand(), bitSet);
}
for (i=0; i < 15; i++) {
printf("%d : %d\n", i , bitSet[i]);
}
system("pause");
return 0;
}
और परीक्षण कोड C#
के लिए:
static void accumulateResults(int random, int[] bitSet)
{
int i;
int isBitSet;
for (i = 0; i < 15; i++)
{
isBitSet = ((random & (1 << i)) != 0) ? 1 : 0;
bitSet[i] += isBitSet;
}
}
static void Main(string[] args)
{
int i;
int[] bitSet = new int[15];
int times = 10000000;
Random r = new Random();
for (i = 0; i < times; i++)
{
accumulateResults(r.Next(), bitSet);
}
for (i = 0; i < 15; i++)
{
Console.WriteLine("{0} : {1}", i, bitSet[i]);
}
Console.ReadKey();
}
बहुत धन्यवाद !! Btw, ओएस विंडोज 7, 64-बिट वास्तुकला & विजुअल स्टूडियो 2010
संपादित
@ दाऊद हेफेरनान को बहुत धन्यवाद है। मैंने यहां कई गलतियां की हैं:
- सी और सी # कार्यक्रमों में बीज अलग था (सी शून्य और सी # - वर्तमान समय का उपयोग कर रहा था)।
- मैंने परिणामों की पुनरुत्पादन के लिए
Times
परिवर्तनीय के विभिन्न मानों के साथ प्रयोग करने की कोशिश नहीं की।
यहाँ जब विश्लेषण किया कैसे संभावना है कि पहली बिट सेट कर दिया जाता यादृच्छिक समय की संख्या पर निर्भर करता है() कहा जाता था मैं क्या मिल गया है:
तो के रूप में कई देखा - परिणाम प्रतिलिपि प्रस्तुत करने योग्य नहीं हैं और नहीं होना चाहिए गंभीरता से लिया। (पुष्टि के कुछ रूप के अलावा कि सी/सी # पीआरएनजी पर्याप्त अच्छे हैं :-))।
मुझे स्कूल में अपने आंकड़े कक्षाओं से बहुत कुछ याद नहीं है, लेकिन आपको यह पता लगाना होगा कि आउटलाइजर्स सांख्यिकीय रूप से हैं या नहीं महत्वपूर्ण या बस यादृच्छिक त्रुटि का परिणाम। आपको कभी भी एक परिपूर्ण वितरण नहीं मिल रहा है। –
क्या ये परिणाम पुनरुत्पादित हैं? वह मुझे आश्चर्यचकित करेगा। यदि आप एक ही परीक्षण को कई बार चलाते हैं, तो मुझे संदेह है कि बाद के रनों पर, अलग-अलग बिट्स "अधिक संभावित" और "कम संभव" हो जाएंगे। – abelenky
मुझे कोई संदेह नहीं है कि वे पुनरुत्पादित हैं। 'रैंड' को आम तौर पर एक रैखिक संगत पीआरएनजी के साथ कार्यान्वित किया जाता है, जिसमें हास्यास्पद रूप से खराब सांख्यिकीय गुण होते हैं। 'रैंड' से उचित परिणाम प्राप्त करने की आपकी सबसे अच्छी उम्मीद केवल प्रत्येक कॉल से एक बिट (उच्च बिट) का उपयोग करना है, और इसे बार-बार कॉल करें ... –