2015-01-07 4 views
10

मैं arc4random() और arc4random_uniform() उपयोग किया गया है और मैं हमेशा महसूस किया था कि वे वास्तव में यादृच्छिक नहीं था, उदाहरण के लिए, मैं था किसी सरणी से बेतरतीब ढंग से चुनने मूल्यों लेकिन अक्सर मानों आया जब मैं उन्हें लगातार कई बार उत्पन्न करता था, तो आज मैंने सोचा कि मैं यह देखने के लिए एक एक्सकोड खेल का मैदान उपयोग करूंगा कि ये फ़ंक्शन कैसे व्यवहार कर रहे हैं, इसलिए मैंने पहले arc4random_uniform का परीक्षण 0 और 4 के बीच की संख्या उत्पन्न करने के लिए किया था, इसलिए मैंने इस एल्गोरिदम का उपयोग किया:arc4random() और arc4random_uniform() वास्तव में यादृच्छिक नहीं है?

import Cocoa 

var number = 0 

for i in 1...20 { 
    number = Int(arc4random_uniform(5)) 
} 

और मैंने इसे चलाया veral बार, और यहाँ कैसे मान समय के सबसे अधिक विकसित हो रहे है:
enter image description here enter image description here

तो तुम मान देख सकते हैं के रूप में बढ़ रही है और बार-बार घट रही है, और एक बार मान अधिकतम/न्यूनतम पर हैं, वे अक्सर एक निश्चित समय के दौरान इसमें रहें (5 वें चरण में पहला स्क्रीनशॉट देखें, मान 6 चरणों के दौरान 3 पर रहता है, समस्या यह है कि यह बिल्कुल असामान्य नहीं है, फ़ंक्शन वास्तव में उस समय से व्यवहार करता है मेरे परीक्षण में

अब, अगर हम arc4random() को देखो, यह मूल रूप से एक ही है:

  • क्यों इस समारोह इस तरह से बर्ताव कर रही है: यहाँ
    enter image description here enter image description here

    तो मेरी सवाल कर रहे हैं?

  • इसे और अधिक यादृच्छिक कैसे बनाएं?

धन्यवाद।

संपादित करें:
अंत में, मैं दो प्रयोगों कि आश्चर्य की बात कर रहे थे, कोई वास्तविक पासा के साथ पहली बार एक बना दिया:
enter image description here
क्या आश्चर्य है मुझे कि मैंने कहा नहीं होगा कि है कि यह यादृच्छिक था, चूंकि मैं उसी प्रकार के पैटर्न को देख रहा था जिसे arc4random() & arc4random_uniform() के लिए गैर-यादृच्छिक के रूप में वर्णित किया गया है, ताकि जीन-बैपटिस्ट यूनस ने इंगित किया कि मनुष्य यह देखने के लिए अच्छा नहीं हैं कि संख्याओं का अनुक्रम वास्तव में यादृच्छिक है या नहीं। उदाहरण के लिए,

import Foundation 

var appeared = [0,0,0,0,0,0,0,0,0,0,0] 
var numberOfGenerations = 1000 

for _ in 1...numberOfGenerations { 
    let randomNumber = Int(arc4random_uniform(11)) 
    appeared[randomNumber]++ 
} 

for (number,numberOfTimes) in enumerate(appeared) { 
    println("\(number) appeard \(numberOfTimes) times (\(Double(numberOfGenerations)/Double(numberOfTimes))%)") 
} 

देखने के लिए कितनी बार प्रत्येक संख्या दिखाई दिया, और प्रभावी ढंग से संख्या बेतरतीब ढंग से उत्पन्न कर रहे हैं:

मैं भी एक और अधिक "वैज्ञानिक" प्रयोग करना चाहता था, इसलिए मैं इस एल्गोरिथ्म बनाया यहां कंसोल से एक आउटपुट है:
0 99 बार दिखाई दिया।
1 9 7 बार दिखाई दिया।
2 78 बार दिखाई दिया।
3 80 बार दिखाई दिया।
4 87 बार दिखाई दिया।
5 107 बार दिखाई दिया।
6 86 बार दिखाई दिया।
7 9 7 बार दिखाई दिया।
8 100 बार दिखाई दिया।
9 91 बार दिखाई दिया।
10 78 बार दिखाई दिए।

तो यह निश्चित रूप से ठीक

संपादित करें # 2 है: मैं फिर से बनाया अधिक रोल के साथ पासा प्रयोग, और यह अभी भी मेरे लिए के रूप में आश्चर्य की बात है:
enter image description here

+0

इसे जांचें: http://stackoverflow.com/questions/56648/whats-the-best-way-to-shuffle-an-nsmutablearray – Mrunal

+0

@Mrunal क्या वे मेरे द्वारा किए गए कार्यों का उपयोग नहीं कर रहे हैं? –

+0

@Mrunal मेरी समस्या यह नहीं है कि सरणी में तत्वों को कैसे बदला जाए, वास्तव में यादृच्छिक संख्याएं कैसे उत्पन्न करें। :) –

उत्तर

8

संख्या का सच्चा यादृच्छिक अनुक्रम उत्पन्न नहीं किया जा सकता एक एल्गोरिदम द्वारा। वे केवल संख्याओं के छद्म-यादृच्छिक क्रम उत्पन्न कर सकते हैं (ऐसा कुछ जो यादृच्छिक अनुक्रम जैसा दिखता है)। तो चुने गए एल्गोरिदम के आधार पर, "यादृच्छिकता" की गुणवत्ता भिन्न हो सकती है। arc4random() अनुक्रमों की गुणवत्ता को आमतौर पर एक अच्छी यादृच्छिकता माना जाता है।

आप दृश्यता की यादृच्छिकता का विश्लेषण नहीं कर सकते ... यादृच्छिकता का पता लगाने के लिए मनुष्य बहुत बुरे हैं! उन्हें कुछ संरचना मिलती है जहां कोई नहीं है। कुछ भी वास्तव में आपके आरेखों में दर्द नहीं होता है (6 तीन पंक्तियों के दुर्लभ अनुवर्ती को छोड़कर, लेकिन यह यादृच्छिकता है, कभी-कभी असामान्य चीजें होती हैं)। अगर आप अनुक्रम उत्पन्न करने और उसके ग्राफ को खींचने के लिए पासा का इस्तेमाल करते हैं तो आपको आश्चर्य होगा। सावधान रहें कि केवल 20 संख्याओं के नमूने को इसकी यादृच्छिकता के खिलाफ गंभीरता से विश्लेषण नहीं किया जा सकता है, आपकी आवश्यकता बहुत अधिक नमूने हैं।

आप अनियमितता के कुछ अन्य प्रकार की जरूरत है, तो आप का उपयोग करने के /dev/random छद्म फ़ाइल है, जो एक यादृच्छिक संख्या हर बार जब आप में पढ़ें। अनुक्रम एल्गोरिदम और बाहरी भौतिक घटनाओं का मिश्रण है कि ay होता द्वारा उत्पन्न होता है उत्पन्न कोशिश कर सकते हैं आपके कंप्यूटर में

+0

जब आपने मुझे बताया कि अगर मैं पासा का उपयोग करता हूं तो मुझे आश्चर्य होगा ... ठीक है, मैंने अभी किया है, और हां, मैं हैरान हूं: http://imgur.com/DZHfTUs अगर मैंने देखा था यह ग्राफ और यह नहीं पता था कि यह एक पासा था, मैंने कहा होगा कि यह एक बुरा यादृच्छिक जनरेटर था। वैसे भी, मुझे अभी भी हैरान है कि मेरी यादृच्छिक पीढ़ियों में, मान अधिकतम के करीब होते हैं और न्यूनतम संख्या की संख्या जो arc4random उत्पन्न कर सकती है, भले ही मुझे बिल्कुल इसका अर्थ न हो, मैं शायद विसंगति अनुक्रम की तरह खोज जेफरी थॉमस उल्लेख कर रहा है। –

+0

मैंने यह देखने के लिए एक एल्गोरिदम बनाया कि प्रत्येक नंबर कितनी बार प्रकट होता है, और यह निश्चित रूप से यादृच्छिक है! उदाहरण के लिए, 0 और 10 के बीच की संख्याओं की 1000 पीढ़ियों के लिए, मैंने: 0 को 101 बार देखा (9.900 9900 9900 99%) 1 87 बार देखा गया (11.4942528735632%) 2 79 बार (12.6582278481013%) 3 9 बार देखा गया (11.1111111111111%) 4 appeard 95 बार (10.5263157894737%) 5 appeard 106 बार (9.43396226415094%) 6 appeard 90 बार (11.1111111111111%) 7 appeard 84 बार (11.9047619047619%) 8 appeard 78 बार (12.8205128205128%) 9 appeard 106 बार (9.43396226415094%) 10 84 बार देखा गया (11.9047619047619%) –

+0

मैंने अपनी पोस्ट संपादित की ... –

4

यह यादृच्छिक कहने पर आपका क्या मतलब है इस पर निर्भर करता है।

टिप्पणियों में कहा गया है, वास्तविक यादृच्छिकता बेकार है। दोहराने या बंद मूल्यों के लंबे तारों की उम्मीद है।

यदि यह आपकी आवश्यकता के अनुरूप नहीं है, तो आपको अपनी आवश्यकता को बेहतर ढंग से परिभाषित करने की आवश्यकता है।

अन्य विकल्पों में shuffle algorithm का उपयोग किसी सरणी में चीजों को ऑर्डर करने के लिए, या low-discrepancy sequence एल्गोरिदम का उपयोग मूल्यों के बराबर वितरण देने के लिए कर सकता है।

+0

मुझे बिल्कुल कम विसंगति अनुक्रम नहीं मिल रहा है, यह है कि अगर मैंने अपने एल्गोरिदम में ऐसा फ़ंक्शन इस्तेमाल किया था, तो मुझे वास्तव में बहुत से 0 मिलेंगे , 1, 2, 3 और 4? (मेरे arc4random_uniform (5) के लिए)? –

+0

मैंने अपनी पोस्ट संपादित की। –

+3

@ TrevörAnneDenise कम विसंगति अनुक्रम यादृच्छिक संख्याओं का रूप है, लेकिन प्रत्येक मूल्य सावधानी से बचने के लिए सावधानीपूर्वक उठाया जाता है। मनुष्यों के लिए, यह वास्तविक यादृच्छिकता से अधिक यादृच्छिक दिखता है। –

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