मैं एक यादृच्छिक संख्या उत्पन्न करने की कोशिश कर रहा हूं, जो 0 और 1 के बीच है। मैं इसके बारे में पढ़ता रहता हूं arc4random(), लेकिन इससे फ्लोट प्राप्त करने के बारे में कोई जानकारी नहीं है। मैं यह कैसे करु?
मैं एक यादृच्छिक संख्या उत्पन्न करने की कोशिश कर रहा हूं, जो 0 और 1 के बीच है। मैं इसके बारे में पढ़ता रहता हूं arc4random(), लेकिन इससे फ्लोट प्राप्त करने के बारे में कोई जानकारी नहीं है। मैं यह कैसे करु?
जवाबों:
[0, 1] में यादृच्छिक मूल्य (0 को छोड़कर, 1 को छोड़कर):
double val = ((double)arc4random() / UINT32_MAX);
यहाँ थोड़ा और विवरण ।
वास्तविक सीमा [0, 0.999999999767169356] है , क्योंकि ऊपरी सीमा (डबल) 0xFFFFFFFF / 0x100000000 है।
ARC4RANDOM_MAXमैन्युअल रूप से परिभाषित किया जाना है, लेकिन 0x1000000004294967296 है , जो है ULONG_MAX + 1। यह कहाँ प्रलेखित है कि किसी भी तरह arc4random()अधिकतम है ULONG_MAX?
// Seed (only once)
srand48(time(0));
double x = drand48();
// Swift version
// Seed (only once)
srand48(Int(Date().timeIntervalSince1970))
let x = drand48()
Drand48 () और erand48 () फ़ंक्शन गैर-नकारात्मक, डबल-सटीक, फ्लोटिंग-पॉइंट मान लौटाते हैं, समान रूप से अंतराल पर वितरित [0.0, 1.0]।
drand48एक बार एक बीज के साथ आरंभ करने की आवश्यकता है। एप्पल प्रलेखन भी सुझाव है कि यह प्रारंभ किया जाना चाहिए।
double। सबसे अच्छी परिशुद्धता कैसे प्राप्त करें, इस पर stackoverflow.com/a/34765674/1033581 देखें ।
स्विफ्ट के लिए 4.2+ देखें: https://stackoverflow.com/a/50733095/1033581
नीचे ओजेसी और स्विफ्ट 4.1 के लिए सही एकरूपता और इष्टतम परिशुद्धता के लिए सिफारिशें दी गई हैं।
Float)[०, १] (०.० और १.० सहित) में एकसमान यादृच्छिक मान , ३२ बिट तक सटीक:
ओबज-सी :
float val = (float)arc4random() / UINT32_MAX;
स्विफ्ट :
let val = Float(arc4random()) / Float(UInt32.max)
यह इसके लिए इष्टतम है:
Float(या Float32) जिसके मंटिसा के लिए 24 बिट्स की एक महत्वपूर्ण परिशुद्धता है48 बिट्स को सटीक रूप से प्राप्त करना आसान है drand48( जो arc4random_bufहुड के नीचे उपयोग करता है )। लेकिन ध्यान दें कि drand48 में बीज की आवश्यकता के कारण खामियां हैं और सब मोंटिसा के सभी 52 बिट्स को बेतरतीब करने के लिए उप- रूपी होने के लिए भी।
[०, १] , ४ 0 बिट्स सटीकता में समान यादृच्छिक मान :
स्विफ्ट :
// seed (only needed once)
srand48(Int(Date.timeIntervalSinceReferenceDate))
// random Double value
let val = drand48()
Doubleऔर Float80)[०, १] (०.० और १.० सहित) में एकसमान यादृच्छिक मान , ६४ बिट्स तक सटीक:
स्विफ्ट , आर्क 4 आयामी के लिए दो कॉल का उपयोग कर:
let arc4random64 = UInt64(arc4random()) << 32 &+ UInt64(arc4random())
let val = Float80(arc4random64) / Float80(UInt64.max)
एक कॉल का उपयोग करके स्विफ्ट करें , arc4random_buf:
var arc4random64: UInt64 = 0
arc4random_buf(&arc4random64, MemoryLayout.size(ofValue: arc4random64))
let val = Float80(arc4random64) / Float80(UInt64.max)
यह इसके लिए इष्टतम है:
Double(या Float64) जिसके मंटिसा के लिए 52 बिट्स की एक महत्वपूर्ण परिशुद्धता हैFloat80अपने अपूर्णांश के लिए 64 बिट्स की एक significand सटीक है जोउत्तर जहां सीमा एक सीमा को छोड़ रही है (0 या 1) संभावना एकरूपता पूर्वाग्रह से ग्रस्त है और इसे टाला जाना चाहिए।
arc4random(), सर्वोत्तम सटीकता 1 / 0xFFFFFFFF (UINT32_MAX) हैarc4random_uniform(), सर्वोत्तम सटीकता 1 / 0xFFFFFFFE (UINT32_MAX-1) हैrand()( गुप्त रूप से arc4random का उपयोग करते हुए ), सर्वोत्तम सटीकता 1 / 0x7FFFFFFF (RAND_MAX) हैrandom()( गुप्त रूप से arc4random का उपयोग करते हुए ), सर्वोत्तम सटीकता 1 / 0x7FFFFFFF (RAND_MAX) हैयह गणितीय रूप से असंभव है कि एक कॉल के साथ , या arc4random, 32 बिट परिशुद्धता से बेहतर प्राप्त किया जा सके । तो हमारे ऊपर 32 बिट्स और 64 बिट्स समाधान सबसे अच्छा होना चाहिए जिसे हम प्राप्त कर सकते हैं।arc4random_uniformrandrandom
यह फ़ंक्शन नकारात्मक फ्लोट श्रेणियों के लिए भी काम करता है:
float randomFloat(float Min, float Max){
return ((arc4random()%RAND_MAX)/(RAND_MAX*1.0))*(Max-Min)+Min;
}
Min+(Max-Min)*((float)arc4random())/ULONG_MAXइसके बजाय उपयोग करें । (float)डाली सिर्फ व्यामोह है।
Swift 4.2 एक श्रेणी में यादृच्छिक मान के लिए मूल समर्थन जोड़ता है:
let x = Float.random(in: 0.0...1.0)
let y = Double.random(in: 0.0...1.0)
let z = Float80.random(in: 0.0...1.0)
डॉक्टर:
(float)rand() / RAND_MAX
अकेले "रैंड ()" बताते हुए पिछला पोस्ट गलत था। यह रैंड () का उपयोग करने का सही तरीका है।
यह 0 -> 1 के बीच एक नंबर बनाएगा
बीएसडी डॉक्स:
रैंड () फ़ंक्शन
0 से RAND_MAX की सीमा में छद्म-यादृच्छिक पूर्णांकों के अनुक्रम की गणना करता है (जैसा कि हेडर फ़ाइल "stdlib.h" द्वारा परिभाषित किया गया है)।
यह फ्लोट यादृच्छिक संख्या स्विफ्ट 3.1 के लिए विस्तार है
// MARK: Float Extension
public extension Float {
/// Returns a random floating point number between 0.0 and 1.0, inclusive.
public static var random: Float {
return Float(arc4random()) / Float(UInt32.max))
}
/// Random float between 0 and n-1.
///
/// - Parameter n: Interval max
/// - Returns: Returns a random float point number between 0 and n max
public static func random(min: Float, max: Float) -> Float {
return Float.random * (max - min) + min
}
}
स्विफ्ट 4.2
स्विफ्ट 4.2 ने मानक पुस्तकालय में एक देशी और काफी पूर्ण-यादृच्छिक रैंडम नंबर एपीआई को शामिल किया है। ( स्विफ्ट इवोल्यूशन प्रस्ताव SE-0202 )
let intBetween0to9 = Int.random(in: 0...9)
let doubleBetween0to1 = Double.random(in: 0...1)
सभी संख्या प्रकारों में स्थिर रैंडम (इन :) फ़ंक्शन होता है जो रेंज लेता है और दिए गए रेंज में रैंडम नंबर देता है।
चाप 4random के ऊपरी सीमा के साथ समस्याओं से बचने के लिए इसका उपयोग करें ()
u_int32_t upper_bound = 1000000;
float r = arc4random_uniform(upper_bound)*1.0/upper_bound;
ध्यान दें कि यह MAC_10_7, IPHONE_4_3 और उच्चतर के लिए लागू है।
upper_bound-1। फिर भी, आपके पास अभी भी ऊपरी तौर पर अपर_बाउंड की वजह से कम सटीकता है, इसलिए आपको ऊपरी_उंटर को UINT32MMAX तक बढ़ाना चाहिए। और आप arc4random()*1.0 / UINT32_MAXइसके बजाय उपयोग करने से बेहतर परिशुद्धता प्राप्त कर सकते हैं arc4random_uniform(UINT32_MAX)*1.0 / (UINT32_MAX-1)।
arc4random 0x100000000 (4294967296) तक की सीमा होती है
0 से 1 के बीच यादृच्छिक संख्या उत्पन्न करने के लिए यह एक और अच्छा विकल्प है:
srand48(time(0)); // pseudo-random number initializer.
double r = drand48();
float x = arc4random() % 11 * 0.1;
यह एक बेतरतीब नाव का निर्माण करता है 0 और 1. यहाँ अधिक जानकारी
rand()
डिफ़ॉल्ट रूप से 0 और 1 के बीच एक यादृच्छिक संख्या (फ्लोट) का उत्पादन करता है।
rand()आईओएस पर मौजूद नहीं लगता है , और अगर ऐसा होता है, तो यह एक पूर्णांक का उत्पादन करेगा जैसे यह हर दूसरे * NIX पर करता है।
rand()सी का हिस्सा है, जो ऑब्जेक्टिव-सी (जो आईओएस प्रोग्रामिंग में उपयोग किया जाता है) के बदले हिस्से में है। सी जैसे कार्य rand()आईओएस पर पूरी तरह से मौजूद हैं, लेकिन arc4random()इसे प्राथमिकता दी जाती है।