র্যান্ডম.উনিফর্ম (0,1) কখনও 0 বা 1 উত্পন্ন করতে পারে?


9

ইন ডকুমেন্টেশন বলা হয়েছে সেখানে যে একটি সুযোগ যে uniform(0,1)মান তৈরি করতে পারেন 0এবং 1

আমি uniform(0, 1)10000 বার দৌড়েছি , তবে এটি কখনও শূন্য করে নি। এমনকি ক্ষেত্রে uniform(0, 0.001)

random.uniform(0,1)কখনও জেনারেট করতে পারে 0নাকি 1?


3
এটি তাত্ত্বিকভাবে সম্ভবত, তবে ব্যবহারিকভাবে কখনও ঘটবে না। গাণিতিকভাবে একটা নির্দিষ্ট পোশাক দৈব চলক 1. 0 ব্যবধান কোনো মান গ্রহণ করতে পারেন X ~ U(0,1), তারপর P(X=x)হয় প্রায় নিশ্চয় এক্স সব মানের জন্য 0,। (এটি হ'ল অন্তরালে অসীম অনেকগুলি সম্ভাব্য মান রয়েছে random.choice
you're

1
@ ফল্টের অবশ্যই গণিতে খুব নির্দিষ্ট অর্থ রয়েছে, যা এখানে সত্যিকার অর্থে বোঝায় না যেহেতু আমাদের একটি বিচ্ছিন্ন বিতরণ একটি ধারাবাহিক বিরতি নয়। 0 এবং 1. ভাসে শুধুমাত্র একটি সসীম সংখ্যা আছে
Wim

2
@ ফল্ট তাই যখন ওপি বাস্তবায়ন সম্পর্কে জিজ্ঞাসা করছে আপনি কেন গাণিতিক কথা বলছেন random.uniform?
wim

1
যদি সেই ডকুমেন্টেশনটি সঠিক হয় তবে আমি কীভাবে কৌতূহল বোধ করি যে এটি সম্ভবত 0 এবং 1 উভয়ই উত্পাদন করতে সক্ষম হয়েছিল [[0, 1) মনে হচ্ছে অনেক সহজ হবে ( Math.random()উদাহরণস্বরূপ জাভাস্ক্রিপ্টে এটি কীভাবে কাজ করে)।
রাই-

1
প্রথম ব্যক্তির জন্য এলোমেলো বীজ পোস্ট করার জন্য 50 পয়েন্টের অনুদান যা random.uniform(0, 1)প্রথম কলটিতে 0 করে দেয়
উইম

উত্তর:


13

uniform(0, 1)উত্পাদন করতে পারে 0, তবে তা কখনও উত্পাদন করতে পারে না1

ডকুমেন্টেশন জানায় যে শেষবিন্দু b পারে উত্পাদিত মান অন্তর্ভুক্ত করা:

bসমীকরণের ভাসমান-পয়েন্ট রাউন্ডিংয়ের উপর নির্ভর করে শেষ-পয়েন্টের মানটি সীমাতে অন্তর্ভুক্ত থাকতে পারে বা নাও পারে a + (b-a) * random()

সুতরাং uniform(0, 1), সূত্রটি 0 + (1-0) * random(), সরলীকরণে 1 * random(), 1হুবহু উত্পাদন করতে সক্ষম হতে হবে । এটি কেবল তখনই ঘটতে পারে যদি random.random()1.0 exactly. However,এলোমেলো () *never* produces1.0` হয় `

random.random()ডকুমেন্টেশন উদ্ধৃত :

[0.0, 1.0) সীমাতে পরবর্তী র্যান্ডম ভাসমান পয়েন্ট নম্বরটি ফিরুন।

স্বরলিপিটির [..., ...)অর্থ হ'ল প্রথম মানটি সমস্ত সম্ভাব্য মানের একটি অংশ, তবে দ্বিতীয়টি হয় না। random.random()সর্বাধিক কাছাকাছি মান উত্পাদন করতে হবে 1.0। পাইথনের ধরণটিfloat একটি আইইইই 754 বেস 64 ভাসমান পয়েন্ট মান , যা বহু বাইনারি ভগ্নাংশ (1/2, 1/4, 1/5, ইত্যাদি) এনকোড করে যা মান random.random()তৈরি করে এবং মানটি উত্পন্ন করে কেবল একটি যোগফল 2 ** -1(1/2) থেকে 2 ** -53(1/9007199254740992) এর মাধ্যমে এই জাতীয় 53 ভগ্নাংশের এলোমেলো নির্বাচন ।

যাইহোক, কারণ এটি মান খুব পাসে তৈরী করতে পারে 1.0, একসঙ্গে ত্রুটি ঘটতে আপনি সংখ্যাবৃদ্ধি ভাসমান যখন বিন্দু nubmers rounding সঙ্গে, আপনি করতে পারেন উত্পাদন bজন্য কিছু মান aএবং b। কিন্তু 0এবং 1সেই মানগুলির মধ্যে নয়।

নোট যা 0.0 উত্পাদন random.random() করতে পারে তাই aসর্বদা random.uniform()( a + (b - a) * 0 == a) এর সম্ভাব্য মানগুলিতে অন্তর্ভুক্ত থাকে । কারণ 2 ** 53বিভিন্ন মান রয়েছে যা random.random()উত্পাদন করতে পারে (53 53 বাইনারি ভগ্নাংশের সমস্ত সম্ভাব্য সংমিশ্রণ), 2 ** 53যা ঘটতে পারে এমন সম্ভাবনা কেবলমাত্র 1 টি (9007199254740992 তে 1)।

সুতরাং যে সর্বোচ্চ সম্ভাব্য মান random.random()উত্পাদন করতে পারে তা হ'ল 1 - (2 ** -53); b - aউচ্চতর random.random()মানগুলি দ্বারা গুণিতকালে রাউন্ডিং কিক করার জন্য কেবলমাত্র একটি ছোট পর্যাপ্ত মান বাছাই করুন । যত ছোট b - aহবে তত সম্ভাবনা তত বেশি:

>>> import random, sys
>>> def find_b():
...     a, b = 0, sys.float_info.epsilon
...     while random.uniform(a, b) != b:
...         b /= 2
...     else:
...         return b
...
>>> print("uniform(0, {0}) == {0}".format(find_b()))
...
uniform(0, 4e-323) == 4e-323

যদি আপনি আঘাত করেন b = 0.0তবে আমরা 1023 বার বিভক্ত হয়েছি, উপরের মানটির অর্থ আমরা 1019 বিভাগের পরে ভাগ্যবান হয়েছি। আমি এখন পর্যন্ত সর্বাধিক মান খুঁজে পেয়েছি (উপরের ফাংশনটি দিয়ে একটি লুপের সাথে চালানো max()) হ'ল 8.095e-320(1008 বিভাগ), তবে সম্ভবত উচ্চতর মান রয়েছে। এটা সব সুযোগের খেলা। :-)

এছাড়া যদি মধ্যে নয় অনেক বিযুক্ত পদক্ষেপ ঘটতে পারে aএবং bযখন মত, aএবং bএকটি উচ্চ এক্সপোনেন্ট আছে এবং এতদূর appart হতে প্রদর্শিত হতে পারে। ভাসমান পয়েন্টের মানগুলি এখনও কেবলমাত্র আনুমানিক হয় এবং তারা এনকোড করতে পারে এমন মানগুলি সীমাবদ্ধ। উদাহরণস্বরূপ, এর মধ্যে পার্থক্য মাত্র 1 বাইনারি ভগ্নাংশ sys.float_info.maxএবং sys.float_info.max - (2 ** 970)তাই একটি 50-50 সুযোগ random.uniform(sys.float_info.max - (2 ** 970), sys.float_info.max)তৈরি হয় sys.float_info.max:

>>> a, b = sys.float_info.max - (2 ** 970), sys.float_info.max
>>> values = [random.uniform(a, b) for _ in range(10000)]
>>> values.count(sys.float_info.max)  # should be roughly 5000
4997

5

"বেশ কয়েকবার" যথেষ্ট নয়। 10,000 যথেষ্ট নয়। random.uniform2 ^ 53 (9,007,199,254,740,992) বিভিন্ন মানগুলির মধ্যে থেকে চয়ন করে। আপনি তাদের মধ্যে দুটিতে আগ্রহী । এই হিসাবে, আপনার ঠিক 0 বা 1 এর মান পাওয়ার আগে বেশ কয়েকটি কোয়াড্রিলিয়ন র্যান্ডম মান উত্পন্ন করার আশা করা উচিত it's সুতরাং এটি সম্ভব, তবে খুব সম্ভবত আপনি এটি কখনও পর্যবেক্ষণ করবেন না।


2
জন্য uniform(0, 1)এটা অসম্ভব উত্পাদন করতে 1পরিণতি হিসাবে। কারণ ফাংশনটি কেবল সংজ্ঞায়িত def uniform(a, b): return a + (b - a) * random()এবং random()কখনই উত্পাদন করতে পারে না 1.0
মার্টিজন পিটারস

2
@ মার্তিজজনপিটারস আমি বিশ্বাস করি আপনি সঠিক বলেছেন, এবং আমি আপনার উত্তরটিকে সমর্থন করেছি। আমি যতটা সন্দেহ করেছি, কিন্তু আমি নিশ্চিত ছিলাম না, এবং এটি আমার জবাবের মূল দিক থেকে আলাদা ছিল, তাই আমি এটি হতে দিই :)
শখ

1

আপনি একটি লুপ চেষ্টা করে জেনারেট করতে পারেন যা সঠিক 0 (না) দেখানোর জন্য প্রয়োজনীয় পুনরাবৃত্তির পরিমাণ গণনা করে।

তদ্ব্যতীত, হবস যেমন বলেছে, uniformlyনমুনাযুক্ত মানগুলির পরিমাণ 9,007,199,254,740,992। যার অর্থ 0 টি দেখার সম্ভাবনা হ'ল 1 / 9,007,199,254,740,992। যার সাধারণ পরিভাষায় এবং বৃত্তাকার অর্থ দাঁড়ায় এটির জন্য আপনাকে 0 খুঁজে পেতে গড়ে গড়ে 10 কোয়াট্রিলিয়ন নমুনার প্রয়োজন হবে অবশ্যই আপনি এটি আপনার প্রথম 10 প্রচেষ্টাতে খুঁজে পেতে পারেন, বা কখনও কখনও হয়নি।

1 টির নমুনা দেওয়া অসম্ভব কারণ মানগুলির জন্য সংজ্ঞায়িত অন্তরটি বন্ধনীর সাথে বন্ধ করা হয়, সুতরাং 1 সহ এটি অন্তর্ভুক্ত নয়।


1

অবশ্যই। uniform(0, 0.001)পরিবর্তে চেষ্টা করে আপনি ইতিমধ্যে সঠিক পথে ছিলেন । এটি যত তাড়াতাড়ি ঘটবে তা সীমাবদ্ধ রাখতে কেবল সীমাবদ্ধ রাখুন।

>>> random.uniform(0., 5e-324)
5e-324
>>> random.uniform(0., 5e-324)
5e-324
>>> random.uniform(0., 5e-324)
0.0
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.