আমি 0 এবং 1 এর মধ্যে একটি এলোমেলো সংখ্যা জেনারেট করার চেষ্টা করছি আমি পড়তে থাকি arc4random()
, তবে এটি থেকে ভাসমান সম্পর্কে কোনও তথ্য নেই। আমি এটা কিভাবে করবো?
উত্তর:
[0, 1 [এ 0 টি (1 বাদে 0 সহ) এলোমেলো মান :
double val = ((double)arc4random() / UINT32_MAX);
এখানে আরও কিছু বিশদ ।
উপরের গণ্ডি (ডাবল) 0xFFFFFFFF / 0x100000000 হিসাবে আসল পরিসরটি [0, 0.999999999767169356] ।
ARC4RANDOM_MAX
ম্যানুয়ালি সংজ্ঞায়িত করতে হবে, তবে 0x100000000
এটি 4294967296 , যা 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()
শিরোনাম 48 () এবং ইরন্ড 48 () ফাংশনগুলি বিরতিতে অ-নেতিবাচক, ডাবল-স্পষ্টতা, ভাসমান-পয়েন্টের মানগুলি প্রদান করে, যা অন্তরালে সমানভাবে বিতরণ করা হয় [0.0, 1.0]।
drand48
একবার বীজ দিয়ে শুরু করা দরকার। অ্যাপল ডকুমেন্টেশন সুপারিশ এটি সক্রিয়া করা উচিত।
double
। সেরা নির্ভুলতা কীভাবে অর্জন করতে হয় তার জন্য স্ট্যাকওভারফ্লো . com/a/34765674/1033581 দেখুন ।
সুইফ্ট 4.2+ এর জন্য দেখুন: https://stackoverflow.com/a/50733095/1033581
নীচে সঠিক অভিন্নতা এবং ওবিজেসি এবং সুইফট ৪.১-এর জন্য অনুকূল নির্ভুলতার জন্য প্রস্তাবনা রয়েছে are
Float
)ইউনিফর্ম এলোমেলো মান [0, 1] (0.0 এবং 1.0 সহ) 32 টি বিট যথার্থতা:
ওবজ-সি :
float val = (float)arc4random() / UINT32_MAX;
দ্রুত :
let val = Float(arc4random()) / Float(UInt32.max)
এটি সর্বোত্তম:
Float
(বা Float32
) যার ম্যান্টিসার জন্য 24 বিটের একটি তাত্পর্যপূর্ণ নির্ভুলতা রয়েছেএটির সাহায্যে 48 বিট নির্ভুলতা অর্জন করা সহজ drand48
( যা arc4random_buf
হুডের নীচে ব্যবহার করে )। তবে মনে রাখবেন যে বীজের প্রয়োজনীয়তার কারণে ড্র্যান্ড 48 এর ত্রুটি রয়েছে এবং ডাবল ম্যান্টিসার সমস্ত 52 বিটকে এলোমেলো করে তুলতে সাবওটিম্যাটাল হওয়ার কারণে।
ইউনিফর্ম এলোমেলো মান [0, 1] , 48 বিট যথার্থ:
দ্রুত :
// seed (only needed once)
srand48(Int(Date.timeIntervalSinceReferenceDate))
// random Double value
let val = drand48()
Double
এবং Float80
)[0, 1] (0.0 এবং 1.0 সহ) এ অভিন্ন র্যান্ডম মান , 64 বিটের যথার্থতা:
আরকিআর্যান্ডোমে দুটি কল ব্যবহার করে সুইফ্ট :
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 / 0xFFFFFFFFF (UINT32_MAX)arc4random_uniform()
, সর্বোত্তম নির্ভুলতা হল 1 / 0xFFFFFFFFE (UINT32_MAX-1)rand()
( arc4random গোপনে ব্যবহার ), শ্রেষ্ঠ স্পষ্টতা হয় 1 / 0x7FFFFFFF (RAND_MAX)random()
( arc4random গোপনে ব্যবহার ), শ্রেষ্ঠ স্পষ্টতা হয় 1 / 0x7FFFFFFF (RAND_MAX)একক কল , বা arc4random
, এর সাথে 32 বিটের যথার্থতার চেয়ে আরও ভাল অর্জন করা গাণিতিকভাবে অসম্ভব । সুতরাং আমাদের উপরের 32 বিট এবং 64 বিট সমাধানগুলি আমরা অর্জন করতে পারি সেরা shouldarc4random_uniform
rand
random
এই ফাংশনটি নেতিবাচক ফ্লোট রেঞ্জগুলির জন্যও কাজ করে:
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)
ঢালাই শুধু প্যারানয়া হয়।
সুইফট 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" দ্বারা সংজ্ঞায়িত করা হয়েছে) এর পরিসরে গণনা করে।
এটি ফ্লোটের এলোমেলো সংখ্যা সুইফট ৩.১ এর জন্য
// 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
সুইফট ৪.২ স্ট্যান্ডার্ড লাইব্রেরিতে একটি নেটিভ এবং মোটামুটি পূর্ণ বৈশিষ্ট্যযুক্ত এলোমেলো সংখ্যার এপিআই অন্তর্ভুক্ত করেছে। ( সুইফট বিবর্তনের প্রস্তাব এসই -0202 )
let intBetween0to9 = Int.random(in: 0...9)
let doubleBetween0to1 = Double.random(in: 0...1)
সমস্ত সংখ্যার ধরণের স্থির র্যান্ডম (ইন :) ফাংশন থাকে যা পরিসর নেয় এবং প্রদত্ত পরিসরটিতে এলোমেলো নম্বর প্রদান করে।
আরক 4 ব্র্যান্ডম () এর উপরের সীমাতে সমস্যা এড়াতে এটি ব্যবহার করুন
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
। তবুও, আপনি এখনও উপরের_বাউন্ডের কারণে স্বতঃস্ফূর্তভাবে কম স্বল্পতা পেতে পারেন, তাই আপনার উপরের চৌম্বকটি UINT32_MAX এ বাড়ানো উচিত। এবং আপনি এর 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 এর আগেও একটি এলোমেলো ফ্লোট তৈরি করে More আরও তথ্য এখানে
rand()
ডিফল্টরূপে 0 এবং 1 এর মধ্যে একটি এলোমেলো সংখ্যা (ভাসা) উত্পাদন করে।
rand()
আইওএস-এ বিদ্যমান বলে মনে হচ্ছে না , এবং যদি এটি হয়ে থাকে তবে এটি প্রতিটি অন্যান্য * এনআইএক্স এর মতো একটি পূর্ণসংখ্যা তৈরি করে।
rand()
সি এর একটি অংশ যা অবজেক্টিভ-সি এর পরিবর্তে অংশ (যা আইওএস প্রোগ্রামিংয়ে ব্যবহৃত হয়)। সি ফাংশন যেমন rand()
আইওএস এ একেবারে বিদ্যমান, তবে arc4random()
এটি পছন্দসই।