मैं 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 बार, और यहाँ कैसे मान समय के सबसे अधिक विकसित हो रहे है:
तो तुम मान देख सकते हैं के रूप में बढ़ रही है और बार-बार घट रही है, और एक बार मान अधिकतम/न्यूनतम पर हैं, वे अक्सर एक निश्चित समय के दौरान इसमें रहें (5 वें चरण में पहला स्क्रीनशॉट देखें, मान 6 चरणों के दौरान 3 पर रहता है, समस्या यह है कि यह बिल्कुल असामान्य नहीं है, फ़ंक्शन वास्तव में उस समय से व्यवहार करता है मेरे परीक्षण में
अब, अगर हम arc4random()
को देखो, यह मूल रूप से एक ही है:
- क्यों इस समारोह इस तरह से बर्ताव कर रही है: यहाँ
तो मेरी सवाल कर रहे हैं?
- इसे और अधिक यादृच्छिक कैसे बनाएं?
धन्यवाद।
संपादित करें:
अंत में, मैं दो प्रयोगों कि आश्चर्य की बात कर रहे थे, कोई वास्तविक पासा के साथ पहली बार एक बना दिया:
क्या आश्चर्य है मुझे कि मैंने कहा नहीं होगा कि है कि यह यादृच्छिक था, चूंकि मैं उसी प्रकार के पैटर्न को देख रहा था जिसे 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 है: मैं फिर से बनाया अधिक रोल के साथ पासा प्रयोग, और यह अभी भी मेरे लिए के रूप में आश्चर्य की बात है:
इसे जांचें: http://stackoverflow.com/questions/56648/whats-the-best-way-to-shuffle-an-nsmutablearray – Mrunal
@Mrunal क्या वे मेरे द्वारा किए गए कार्यों का उपयोग नहीं कर रहे हैं? –
@Mrunal मेरी समस्या यह नहीं है कि सरणी में तत्वों को कैसे बदला जाए, वास्तव में यादृच्छिक संख्याएं कैसे उत्पन्न करें। :) –