0 এবং 1 এর মধ্যে একটি এলোমেলো ফ্ল্যাট তৈরি করুন


84

আমি 0 এবং 1 এর মধ্যে একটি এলোমেলো সংখ্যা জেনারেট করার চেষ্টা করছি আমি পড়তে থাকি arc4random(), তবে এটি থেকে ভাসমান সম্পর্কে কোনও তথ্য নেই। আমি এটা কিভাবে করবো?


4
সদৃশ নয়, স্পষ্টভাবে ভাসমান সম্পর্কিত এটিই একমাত্র প্রশ্ন।
পি i

উত্তর:


139

[0, 1 [এ 0 টি (1 বাদে 0 সহ) এলোমেলো মান :

এখানে আরও কিছু বিশদ ।

উপরের গণ্ডি (ডাবল) 0xFFFFFFFF / 0x100000000 হিসাবে আসল পরিসরটি [0, 0.999999999767169356]


ধন্যবাদ. বেশিরভাগ সোজা ফরোয়ার্ড উত্তর আমি দেখেছি। আমি আপনার লিঙ্কটি পড়তে হবে এবং এই সম্পর্কে অতিরিক্ত বিবরণ পাবেন। আবার ধন্যবাদ.
জিনি

4
এটি অদ্ভুত যেটিকে ARC4RANDOM_MAXম্যানুয়ালি সংজ্ঞায়িত করতে হবে, তবে 0x100000000এটি 4294967296 , যা ULONG_MAX + 1। এটি কোথায় নথিবদ্ধ হয়েছে যে কোনওভাবেই arc4random()সর্বোচ্চ ULONG_MAX?
ববোবোবো

@ বোবোবো, এখান থেকে: developer.apple.com/library/mac/#docamentation/Darwin/References/… আরক 4 ব্র্যান্ডম () ফাংশনটি সিউডো-এলোমেলো সংখ্যাগুলি 0 থেকে (2 ** 32) -1 এর মধ্যে প্রদান করে
ভ্লাদিমির

8
আসলে, মানটি 0xFFFFFFFFF, (2 ** 32) -1 == 0x100000000 - 0x1 == 0xFFFFFFFF == ইউআইএনটি 32_MAX হিসাবে লিঙ্কটিতে জার্গ বোহমান জানিয়েছেন যেটি হওয়া উচিত।
জোসজুলিও

4
এইভাবে উত্পন্ন মানগুলি অভিন্নভাবে বিতরণের গ্যারান্টিযুক্ত নয়!
কেলিন

107

শিরোনাম 48 () এবং ইরন্ড 48 () ফাংশনগুলি বিরতিতে অ-নেতিবাচক, ডাবল-স্পষ্টতা, ভাসমান-পয়েন্টের মানগুলি প্রদান করে, যা অন্তরালে সমানভাবে বিতরণ করা হয় [0.0, 1.0]।


19
এটি সেরা উত্তর হওয়া উচিত।
জন রিসেলভাতো

আপনার সম্ভবত সামান্য উত্তরটি আপডেট করতে হবে, আমি এনএসএইচইপস্টারে পড়েছি যে drand48একবার বীজ দিয়ে শুরু করা দরকার। অ্যাপল ডকুমেন্টেশন সুপারিশ এটি সক্রিয়া করা উচিত।
ডুলাকাসি

4
বীজ প্রয়োজন কারণ এটি এলোমেলো জেনারেটরকে গণনার জন্য একটি সূচনা পয়েন্ট দেয়। এটি ছাড়াই অ্যাপ্লিকেশন লঞ্চ জুড়ে এলোমেলো ক্রম সর্বদা এক রকম হবে।
জোভান স্টানকোভিচ

এটি সেরা উত্তর।
সাবিল্যান্ড ২

এই উত্তরটি কোনওটির জন্য অনুকূল নির্ভুলতার উত্তর নয় double। সেরা নির্ভুলতা কীভাবে অর্জন করতে হয় তার জন্য স্ট্যাকওভারফ্লো . com/a/34765674/1033581 দেখুন ।
সিউর

16

সুইফ্ট 4.2+ এর জন্য দেখুন: https://stackoverflow.com/a/50733095/1033581


নীচে সঠিক অভিন্নতা এবং ওবিজেসি এবং সুইফট ৪.১-এর জন্য অনুকূল নির্ভুলতার জন্য প্রস্তাবনা রয়েছে are

32 বিট নির্ভুলতা (অনুকূল Float)

ইউনিফর্ম এলোমেলো মান [0, 1] (0.0 এবং 1.0 সহ) 32 টি বিট যথার্থতা:

ওবজ-সি :

দ্রুত :

এটি সর্বোত্তম:

  • Float(বা Float32) যার ম্যান্টিসার জন্য 24 বিটের একটি তাত্পর্যপূর্ণ নির্ভুলতা রয়েছে

48 বিট নির্ভুলতা (নিরুৎসাহিত)

এটির সাহায্যে 48 বিট নির্ভুলতা অর্জন করা সহজ drand48( যা arc4random_bufহুডের নীচে ব্যবহার করে )। তবে মনে রাখবেন যে বীজের প্রয়োজনীয়তার কারণে ড্র্যান্ড 48 এর ত্রুটি রয়েছে এবং ডাবল ম্যান্টিসার সমস্ত 52 বিটকে এলোমেলো করে তুলতে সাবওটিম্যাটাল হওয়ার কারণে।

ইউনিফর্ম এলোমেলো মান [0, 1] , 48 বিট যথার্থ:

দ্রুত :

64 বিট নির্ভুলতা (এর জন্য সর্বোত্তম Doubleএবং Float80)

[0, 1] (0.0 এবং 1.0 সহ) এ অভিন্ন র্যান্ডম মান , 64 বিটের যথার্থতা:

আরকিআর্যান্ডোমে দুটি কল ব্যবহার করে সুইফ্ট :

Arc4random_buf এ একটি কল ব্যবহার করে সুইফ্ট :

এটি সর্বোত্তম:

  • একটি 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_uniformrandrandom


রিয়েল আইওএস ডিভাইসে 'ফ্লোট 80' অনুপলব্ধ (এটি কেবল সিমুলেটারে কাজ করে)।
Cœur

10

এই ফাংশনটি নেতিবাচক ফ্লোট রেঞ্জগুলির জন্যও কাজ করে:


4
বহিরাগত মডুলাস অপারেশন। Min+(Max-Min)*((float)arc4random())/ULONG_MAXপরিবর্তে ব্যবহার করুন। (float)ঢালাই শুধু প্যারানয়া হয়।
ববোবোবো

@ বোবোবো যখন আমি বহিরাগত মডুলাসের সাথে একমত হয়েছি, আমি ULT_MAX (44৪ বিটের পরিবর্তে 18446744073709551615) এর পরিবর্তে UINT32_MAX (সর্বদা 4294967295) দ্বারা ভাগ করার পরামর্শ দিই।
সিউর

7

সুইফট 4.2+ +

সুইফট 4.2 একটি রেঞ্জের এলোমেলো মানের জন্য দেশীয় সমর্থন যুক্ত করে:

ডক:


1

পূর্ববর্তী পোস্টটি "র্যান্ড ()" একাকী ভুল ছিল। এটি র্যান্ড () ব্যবহারের সঠিক উপায়।

এটি 0 -> 1 এর মধ্যে একটি সংখ্যা তৈরি করবে

বিএসডি ডক্স:

র‌্যান্ড () ফাংশনটি সিউডো-এলোমেলো পূর্ণসংখ্যার ক্রম
0 থেকে RAND_MAX (যে শিরোনাম ফাইল "stdlib.h" দ্বারা সংজ্ঞায়িত করা হয়েছে) এর পরিসরে গণনা করে।


1

এটি ফ্লোটের এলোমেলো সংখ্যা সুইফট ৩.১ এর জন্য



1

সুইফট 4.2

সুইফট ৪.২ স্ট্যান্ডার্ড লাইব্রেরিতে একটি নেটিভ এবং মোটামুটি পূর্ণ বৈশিষ্ট্যযুক্ত এলোমেলো সংখ্যার এপিআই অন্তর্ভুক্ত করেছে। ( সুইফট বিবর্তনের প্রস্তাব এসই -0202 )

সমস্ত সংখ্যার ধরণের স্থির র্যান্ডম (ইন :) ফাংশন থাকে যা পরিসর নেয় এবং প্রদত্ত পরিসরটিতে এলোমেলো নম্বর প্রদান করে।


0

আরক 4 ব্র্যান্ডম () এর উপরের সীমাতে সমস্যা এড়াতে এটি ব্যবহার করুন

নোট করুন যে এটি MAC_10_7, IPHONE_4_3 এবং এর চেয়ে বেশি ক্ষেত্রে প্রযোজ্য।


এটির সাথে একটি মৌলিক সীমার সমস্যা রয়েছে। আপনি যখন উপরের_বাউন্ডটি 10 ​​তে সেট করেন তখন এটি সহজেই লক্ষণীয় হয়, arc4random_uniform 0 থেকে 9 পর্যন্ত মান ফিরে আসবে এবং চূড়ান্ত ফলাফলটি 0.0000 থেকে 0.9000 পর্যন্ত হবে। পরিবর্তে আপনি দ্বারা বিভক্ত করা উচিত upper_bound-1। তবুও, আপনি এখনও উপরের_বাউন্ডের কারণে স্বতঃস্ফূর্তভাবে কম স্বল্পতা পেতে পারেন, তাই আপনার উপরের চৌম্বকটি UINT32_MAX এ বাড়ানো উচিত। এবং আপনি এর arc4random()*1.0 / UINT32_MAXপরিবর্তে ব্যবহার করে আরও ভাল নির্ভুলতা পেতে পারেন arc4random_uniform(UINT32_MAX)*1.0 / (UINT32_MAX-1)
Cœur

-1

arc4random 0x100000000 (4294967296) অবধি রয়েছে

0 থেকে 1 এর মধ্যে এলোমেলো সংখ্যা উত্পন্ন করার জন্য এটি আরেকটি ভাল বিকল্প:


আরক 4 ব্র্যান্ডম সর্বাধিক মান 0xFFFFFFFF
Cœur

ধন্যবাদ @ সিউর .. ম্যাক্স ভাল 0xFFFFFFFF আমি জানতাম না
ডগি

আপনার সমাধানটি জোভান স্টানকোভিচের উত্তরের মতো।
সিউর

ওহ, আমি এটি @ সিউর দেখিনি
গুরুুনাথা ডগি

-4

এটি 0 এবং 1 এর আগেও একটি এলোমেলো ফ্লোট তৈরি করে More আরও তথ্য এখানে


4
দ্রষ্টব্য: কেবল ১১ টি পৃথক মান দেয়: ০.০, ০.০, ০.২, ..., 1.0
টকলিটলে

8
হ্যাঁ, মডিউলাস অপারেশন আরক 4 ব্র্যান্ডম () এর ফলাফল 0 এবং 10 এর মধ্যে হ্রাস করে, তারপরে সেটিকে এটি 10 ​​দ্বারা ভাগ করে দেয় This এই উত্তরটি সাধারণ ব্যবহারের জন্য সত্যই খারাপ।
বোবোবোবো

-4

ডিফল্টরূপে 0 এবং 1 এর মধ্যে একটি এলোমেলো সংখ্যা (ভাসা) উত্পাদন করে।


4
এটি আমার জন্য একটি এলোমেলো ইনট উত্পাদন করে।
অ্যালেক্সকিউ 9'13

rand()আইওএস-এ বিদ্যমান বলে মনে হচ্ছে না , এবং যদি এটি হয়ে থাকে তবে এটি প্রতিটি অন্যান্য * এনআইএক্স এর মতো একটি পূর্ণসংখ্যা তৈরি করে।
jscs

4
@ জোশক্যাসওয়েল rand()সি এর একটি অংশ যা অবজেক্টিভ-সি এর পরিবর্তে অংশ (যা আইওএস প্রোগ্রামিংয়ে ব্যবহৃত হয়)। সি ফাংশন যেমন rand()আইওএস এ একেবারে বিদ্যমান, তবে arc4random()এটি পছন্দসই।
ফ্রুঙ্গি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.