2015-06-14 3 views
14

मैं तेजी से/mac_os_x में जीवन कार्यान्वयन के एक अनुकूलित खेल के साथ खेल रहा हूं। पहला कदम: कोशिकाओं की एक बड़ी ग्रिड यादृच्छिक (50% जीवित)।arc4random (मैक ओएस एक्स) कितना यादृच्छिक है? (या मैं गलत क्या कर रहा हूं?)

कोड:

for(var i=0;i<768;i++){ 
    for(var j=0;j<768;j++){ 
    let r = Int(arc4random_uniform(100)) 
    let alive = (aliveOdds > r) 
    self.setState(alive,cell: Cell(tup:(i,j)),cells: aliveCells) 
    } 
} 

मैं एक अपेक्षाकृत वर्दी अनियमितता की उम्मीद है।

Large image

निचले बाएँ पर थोड़ा ज़ूम इन:: क्या मैं निश्चित पैटर्न है

zoomed in

(मैं हर 32 पंक्ति और स्तंभ पर काला करने के लिए रंग बदल दिया है, यह देखने के लिए कि पैटर्न 2 की किसी भी शक्ति के साथ लाइन में हैं)।

पैटर्न के कारण क्या कोई संकेत है? मैंने कोशिश की है:

  • rand() के साथ arc4random की जगह।
  • प्रत्येक arc4random_uniform कॉल
  • स्थानांतरण प्रदर्शन से पहले जोड़ने arc4stir() (सुनिश्चित करने के लिए पैटर्न डेटा, नहीं एक प्रदर्शन गड़बड़ में है) अगले चरणों के बारे

विचार?

+1

वास्तव में बहुत अजीब बात है, आप 'drand48()' ('srand48 (int) 'के साथ बीज' बीजिंग यादृच्छिक संख्या जनरेटर) की कोशिश कर सकते हैं जो 'arc4random()' के रूप में यादृच्छिकता में अच्छा है और बीच में दोहराता है 0 और 1 (अनन्य)। यह भी देखें: http://nshipster.com/random/ – Kametrixom

+2

मैं अधिक से अधिक संदिग्ध हूं कि यह arc4rand बिल्कुल नहीं है ... अभी भी प्रयोग कर रहा है, अगर मैं कुछ भी समझता हूं तो मैं वापस रिपोर्ट करूंगा। – pmeyer

+2

ठीक है, अब यह आधिकारिक तौर पर परेशान है। मैं अब समस्या का पुनरुत्पादन नहीं कर सकता। मैंने इसे कई दिनों तक किया है (ज्यादातर इसे अनदेखा किया गया है, क्योंकि मैं अनुकरण भाग पर काम कर रहा था)। हालांकि, उपरोक्त पोस्ट किए गए यादृच्छिक पीढ़ी कोड के साथ, अब मैं एक समान क्षेत्र कहूंगा। कोई सुराग नहीं। – pmeyer

उत्तर

1
  1. आप किसी भी प्रदर्शन योग्य सेट (16 * (2 ** 31) -1) पर arc4random की अवधि या कई नियमित गैर-वर्दी क्लस्टर नहीं मार सकते हैं।

ये निश्चित रूप से दूषित/अनियमित स्मृति के संकेत हैं। उदाहरण के लिए, आप 768x768 फ़ील्ड प्रारंभ कर रहे हैं, लेकिन आप हमें 1024xsethingething फ़ील्ड दिखा रहे हैं।

  1. इंट (arc4random_uniform (100)) को बदलने के लिए केवल 100 के साथ बदलने का प्रयास करें।