পাইথনে numpy.random এবং random.random এর মধ্যে পার্থক্য


103

পাইথনে আমার একটি বড় স্ক্রিপ্ট রয়েছে। আমি নিজেকে অন্য লোকের কোডে অনুপ্রাণিত করেছি তাই আমি numpy.randomকিছু জিনিসের জন্য মডিউলটি ব্যবহার করে শেষ করেছি (উদাহরণস্বরূপ দ্বিপদী বিতরণ থেকে নেওয়া এলোমেলো সংখ্যার অ্যারে তৈরি করার জন্য) এবং অন্য জায়গায় আমি মডিউলটি ব্যবহার করি random.random

কেউ দয়া করে আমাকে দুজনের মধ্যে প্রধান পার্থক্য বলতে পারেন? দু'জনের জন্য ডক ওয়েবপৃষ্ঠাটি দেখে আমার কাছে মনে হয় যে numpy.randomআরও কয়েকটি পদ্ধতি রয়েছে তবে এলোমেলো সংখ্যার প্রজন্ম কীভাবে আলাদা তা সম্পর্কে আমি অস্পষ্ট।

আমি জিজ্ঞাসা করার কারণটি হ'ল কারণ আমার ডিবাগিংয়ের উদ্দেশ্যে আমার মূল প্রোগ্রামটি বীজ করা দরকার। আমি আমদানি করছি এমন সমস্ত মডিউলগুলিতে একই র্যান্ডম নম্বর জেনারেটরটি ব্যবহার না করা পর্যন্ত এটি কাজ করে না, এটি কি সঠিক?

এছাড়াও, আমি এখানে অন্য একটি পোস্টে পড়েছি, ব্যবহার না করার বিষয়ে একটি আলোচনা numpy.random.seed(), তবে আমি কেন সত্যিই বুঝতে পারি নি কেন এটি এত খারাপ ধারণা। কেউ যদি আমাকে ব্যাখ্যা করে যে কেন এটি হয় সে জন্য আমি সত্যই প্রশংসা করব।

উত্তর:


124

আপনি ইতিমধ্যে অনেক সঠিক পর্যবেক্ষণ করেছেন!

যদি আপনি উভয় এলোমেলো জেনারেটর বীজ করতে না চান তবে সম্ভবত একটি জেনারেটর বা অন্যজনকে বেছে নেওয়া দীর্ঘমেয়াদে সহজ। তবে আপনার যদি উভয়ই ব্যবহারের প্রয়োজন হয় তবে হ্যাঁ, আপনার উভয়কে বীজ করতে হবে, কারণ তারা একে অপরের সাথে স্বাধীনভাবে এলোমেলো সংখ্যা তৈরি করে।

কারণ numpy.random.seed(), মুখ্য অসুবিধাটি হ'ল এটি থ্রেড-নিরাপদ নয় - অর্থাত্ যদি আপনার মৃত্যুদণ্ডের বিভিন্ন ধরণের থাকে তবে এটি ব্যবহার করা নিরাপদ নয় , কারণ একই সাথে দুটি ভিন্ন থ্রেড যদি ফাংশনটি সম্পাদন করে তবে এটি কাজ করার গ্যারান্টিযুক্ত নয়। যদি আপনি থ্রেড ব্যবহার না করে থাকেন এবং আপনি যদি যুক্তিসঙ্গতভাবে আশা করতে পারেন যে ভবিষ্যতে আপনার প্রোগ্রামটি পুনরায় লেখার দরকার নেই তবে তা numpy.random.seed()ঠিক আছে। ভবিষ্যতে আপনার থ্রেডগুলির প্রয়োজন হতে পারে এমন সন্দেহের যদি কোনও কারণ থাকে তবে প্রস্তাবিত হিসাবে কাজটি করা এবং শ্রেণীর স্থানীয় উদাহরণ তৈরি করাnumpy.random.Random দীর্ঘমেয়াদে অনেক বেশি নিরাপদ । আমি যতদূর বলতে পারি, random.random.seed()থ্রেড-নিরাপদ (বা কমপক্ষে, আমি এর বিপরীতে কোনও প্রমাণ পাইনি)।

numpy.randomগ্রন্থাগার সাধারণভাবে বৈজ্ঞানিক গবেষণা ব্যবহৃত কিছু অতিরিক্ত সম্ভাব্যতা ডিস্ট্রিবিউশন, সেইসাথে র্যান্ডম ডেটার অ্যারে জেনারেট করার জন্য সুবিধার ফাংশন একটি দম্পতি রয়েছে। random.randomগ্রন্থাগার একটু বেশি লাইটওয়েট, এবং জরিমানা করা উচিত যদি তোমরা বৈজ্ঞানিক গবেষণা বা পরিসংখ্যানে কাজ অন্য ধরনের না করছেন।

অন্যথায়, তারা দুজনেই তাদের এলোমেলো সংখ্যা তৈরি করতে মার্সেন টুইস্টার ক্রম ব্যবহার করে এবং তারা উভয়ই সম্পূর্ণ নির্বিচারবাদী - এটি যদি আপনি কয়েকটি মূল কী বিটগুলি জানেন তবে পরের সংখ্যাটি পরবর্তী কোনটি আসবে তা নিখুঁত নিশ্চিত করেই ভবিষ্যদ্বাণী করা সম্ভব । এই কারণে, numpy.random বা random.random কোনও গুরুতর ক্রিপ্টোগ্রাফিক ব্যবহারের জন্য উপযুক্ত নয় । ক্রমটি এত দীর্ঘ যেহেতু, উভয় ক্ষেত্রে এমন র্যান্ডম সংখ্যা উত্পন্ন করার জন্য ঠিক আছে যেখানে আপনি আপনার ডেটা বিপরীতে ইঞ্জিনিয়ার করার চেষ্টা করছেন এমন লোকেরা চিন্তিত নন। এলোমেলো মান বীজ করার প্রয়োজনীয়তারও এটি কারণ - আপনি যদি প্রতিবার একই জায়গায় শুরু করেন তবে আপনি সর্বদা এলোমেলো সংখ্যার একই ক্রমটি পাবেন!

একটি সাইড নোট হিসাবে, আপনি যদি না ক্রিপ্টোগ্রাফিক স্তর যদৃচ্ছতা, আপনি ব্যবহার করা উচিত গোপন মডিউল, অথবা ভালো কিছু Crypto.Random আপনি একটি পাইথন সংস্করণ পাইথন 3.6 আগের ব্যবহার করছেন।


14
দূরবর্তী সম্পর্কিত নোট হিসাবে এটি কখনও কখনও ব্যবহারের জন্য প্রয়োজনীয় নয় , যেহেতু মের্সেন টুইস্টার ক্রিপ্টোগ্রাফিক (এবং কিছু অস্বাভাবিক বৈজ্ঞানিক) উদ্দেশ্যে যথেষ্ট এনট্রপির র্যান্ডম ক্রম উত্পাদন করে না। বিরল ক্ষেত্রে, আপনার প্রায়শই ক্রিপ্টো.র্যান্ডম প্রয়োজন হয় , যা random.randomএকা থেকে পাওয়া যায় তার চেয়ে অনেক উচ্চ মানের নন- ডিস্ট্রিমেন্টিক র্যান্ডম ক্রম উত্পন্ন করতে ওএস নির্দিষ্ট এনট্রপি উত্স ব্যবহার করতে সক্ষম । যদিও আপনার সাধারণত এটি প্রয়োজন হয় না।
সিঙ্গেলাইজেশন ইলিমিনেশন

ধন্যবাদ হ্যান্নেল আপনার অন্তর্দৃষ্টি সত্যই খুব দরকারী ছিল! দেখা যাচ্ছে যে আমি কেবলমাত্র একটি একক র‌্যান্ডম নম্বর জেনারেটর ব্যবহার করে দূরে যেতে পারি না (যা এলোমেলো হওয়া দরকার যেহেতু এলোমেলোভাবে দ্বিপদী বিতরণ উত্পন্ন হয় না) কারণ আমার প্রোগ্রামের অংশগুলি অন্য প্রোগ্রামকে কল করে যা এলোমেলোভাবে ব্যবহার করে। আমি দুটি জেনারেটর বীজ করতে হবে।
লরা

4
"আপনি যদি এখন জানেন যে আপনার কোন সংখ্যাটি রয়েছে তবে পরবর্তী কোন সংখ্যাটি আসবে তা নিখুঁতভাবে নিশ্চিত করা সম্ভব" " আমি মনে করি এই বিবৃতিতে কিছু স্পষ্টতার প্রয়োজন হতে পারে। এর অর্থ হ'ল আপনি যদি জেনারেটরের অভ্যন্তরীণ অবস্থা জানেন তবে আপনি ক্রমটি পুনরুত্পাদন করতে পারবেন - আপনি যখন জেনারেটর বীজ করেন তখন আপনি যা করেন। জেনারেটর থেকে একক সংখ্যা আউটপুট দেওয়া আপনি পরবর্তী নম্বরটি অনুমান করতে পারবেন না। পিরিয়ডটি এত বড় যে আপনি সিউডো-এলোমেলো ক্রমটি কোথায় আছেন তা গণনা করার আগে আপনার সংখ্যার দীর্ঘ ক্রমিকের প্রয়োজন হবে এবং পরেরটিটির পূর্বাভাস দিন।
কৌশিক ঘোষ

12

ডেটা অ্যানালাইসিসের জন্য পাইথন থেকে , মডিউলটি বিভিন্ন ধরণের সম্ভাব্যতা বিতরণ থেকে নমুনা মানগুলির পুরো অ্যারেটি দক্ষতার সাথে তৈরি করার জন্য ফাংশনগুলির সাথে numpy.randomপাইথনকে পরিপূরক করে random

বিপরীতে, পাইথনের বিল্ট-ইন randomমডিউল কেবলমাত্র একবারে একটি মান স্যাম্পল করে, যখন numpy.randomখুব বড় নমুনা দ্রুত তৈরি করতে পারে। আইপিথন ম্যাজিক ফাংশন ব্যবহার করে যে কোনও %timeitমডিউলটি দ্রুত সম্পাদন করে তা দেখতে পাবে:

In [1]: from random import normalvariate
In [2]: N = 1000000

In [3]: %timeit samples = [normalvariate(0, 1) for _ in xrange(N)]
1 loop, best of 3: 963 ms per loop

In [4]: %timeit np.random.normal(size=N)
10 loops, best of 3: 38.5 ms per loop

4
অন্যান্য পদ্ধতির ক্ষেত্রে নয়। np.random.randint(2)সঙ্গে তুলনা করা হয়েছে random.randrange(2)এবং NumPy ধীর ছিল । NumPy: 1.25 আমাদের এবং এলোমেলো: 891 এনএস। এবং এছাড়াও জন্য একই সম্পর্ক np.random.rand()এবং random.random()
শায়ান আমানী

3

বীজের উত্স এবং ব্যবহৃত বিতরণ প্রোফাইল আউটপুটগুলিকে প্রভাবিত করবে - আপনি যদি ক্রিপ্টোগ্রাফিক র্যান্ডমনেস খুঁজছেন, তবে os.urandom () এর বীজ ডিভাইস চ্যাটার (যেমন ইথারনেট বা ডিস্ক) থেকে প্রায় বাস্তব এলোমেলো বাইট পাবেন (যেমন / ডিএস / বিএসডি তে এলোমেলো)

এটি আপনাকে একটি বীজ প্রদান এবং তাই নির্ধারণমূলক এলোমেলো সংখ্যা তৈরি করা এড়াতে পারে will তবে এলোমেলো কলগুলি আপনাকে বিতরণে নম্বরগুলি ফিট করতে দেয় (যাকে আমি বৈজ্ঞানিক এলোমেলো নেস বলি - শেষ পর্যন্ত আপনি যা চান তা এলোমেলো সংখ্যার একটি বেল বক্ররেখা বিতরণ, অদ্ভুতভাবে এটি বিলোপ করাতে সেরা।

হ্যাঁ, একটি জেনারেটরের সাথে লেগে থাকুন তবে সিদ্ধান্ত নিন যে আপনি কী এলোমেলো চান - এলোমেলোভাবে, তবে একটি বিতরণকারী বক্ররেখা থেকে ডিফিটনিয়ালি বা কোয়ান্টাম ডিভাইস ছাড়াই আপনি এলোমেলোভাবে পেতে পারেন।


আপনাকে অনেক ধন্যবাদ পল, আপনার উত্তরটি সত্যই কার্যকর ছিল! আমি ক্রিপ্টোগ্রাফিক এলোমেলোতা খুঁজছি না, আমি গাণিতিক মডেলিং করছি এবং সিউডো-এলোমেলো সংখ্যা আমার পক্ষে যথেষ্ট। এটি সক্রিয় আউট আমি এক জেনারেটরের বিদ্ধ করতে পারে না হিসাবে আমি চেয়েছিলাম যেহেতু আমি আমার প্রোগ্রাম অন্য প্রোগ্রাম আহ্বান দ্বিপদ বিতরণের জন্য numpy এবং প্রয়োজন যে ব্যবহারসমূহ র্যান্ডম :(
লরা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.