1 মান থেকে বীজ এন স্বতন্ত্র এলোমেলো সংখ্যা জেনারেটর সেরা উপায়


10

আমার প্রোগ্রামে আমার প্রতিটি নিজস্ব আরএনজি দিয়ে এন আলাদা আলাদা থ্রেড চালানো দরকার যা বড় ডেটাসেটের নমুনার জন্য ব্যবহৃত হয়। আমার এই পুরো প্রক্রিয়াটি একটি একক মান দিয়ে বীজ করতে সক্ষম হওয়া দরকার যাতে আমি ফলাফলগুলি পুনরুত্পাদন করতে পারি।

প্রতিটি সূচকের জন্য কেবল ক্রমানুসারে বীজ বাড়ানো কি যথেষ্ট?

বর্তমানে আমি ব্যবহার numpyএর RandomStateযা একটি Mersenne প্রতারক সিউডো-রেণ্ডম সংখ্যা উত্পাদক ব্যবহার করে।

নীচে কোড স্নিপেট:

# If a random number generator seed exists
if self.random_generator_seed:
    # Create a new random number generator for this instance based on its
    # own index
    self.random_generator_seed += instance_index
    self.random_number_generator = RandomState(self.random_generator_seed)

মূলত আমি ব্যবহারকারীর ইনপুটযুক্ত বীজ দিয়ে শুরু করি (এটি উপস্থিত থাকলে) এবং প্রতিটি দৃষ্টান্ত / থ্রেডের জন্য আমি ক্রমান্বয়ে চলমান সূচকে (0 থেকে এন -1) যুক্ত করব। আমি জানি না এটি ভাল অনুশীলন কিনা বা এটি করার আরও ভাল উপায় আছে কিনা।


1
আপনি কি জানেন যে প্রতিটি থ্রেড কতগুলি সিউডো এলোমেলো মান ব্যবহার করবে - বা কমপক্ষে আপনি একটি ভাল উচ্চতর আবদ্ধ প্রাক্কলন পেতে পারেন?
হোবার

না আমি পারব না. এটি এমন অঞ্চলগুলির নমুনা করে যেখানে সংক্ষিপ্ত পরিমাণ না হওয়া অবধি সংক্ষিপ্তভূক্ত হয়। অঞ্চলগুলির আকারগুলি উল্লেখযোগ্যভাবে পরিবর্তিত হতে পারে।
এরিকআর

উত্তর:


9

এটি অবশ্যই দুর্দান্ত অনুশীলন নয়। উদাহরণস্বরূপ, আপনি যখন 12345 এবং 12346 এর মূল বীজ দিয়ে দুটি রান করেন তখন কী হয় তা বিবেচনা করুন Each প্রতিটি রানের N-1স্ট্রিম মিলবে ।

Mersenne টুইটার বাস্তবায়ন (সহ numpy.randomএবং random) সাধারণত পৃথক বীজকে বড় স্টেট ভেক্টরে (624 32-বিট ইন্টিজার) এমটিটি ব্যবহার করে বিস্তৃত করতে পৃথক PRNG ব্যবহার করে; এই থেকে অ্যারে হয় RandomState.get_state()। আপনি যা চান তা করার একটি ভাল উপায় হ'ল পিআরএনজি চালানো, একবার আপনার ইনপুট পূর্ণসংখ্যার সাথে বীজযুক্ত, এবং N*624এটি থেকে 32-বিট পূর্ণসংখ্যা পাওয়া। Nরাষ্ট্র ভেক্টরগুলিতে প্রবাহিত হয়ে স্প্লিট করুন এবং RandomState.set_state()প্রতিটি RandomStateউদাহরণ সুস্পষ্টভাবে শুরু করতে ব্যবহার করুন । সেই পিআরএনজি পেতে আপনাকে স্ট্যান্ডার্ড লাইব্রেরির সি উত্সগুলি থেকে numpy.randomবা পরামর্শ নিতে হতে পারে _random(সেগুলি একই) are আমি নিশ্চিত নই যে পাইথনের জন্য কেউ সেই পিআরএনজির একটি স্বতন্ত্র সংস্করণ প্রয়োগ করেছে কিনা।


আমি মনে করি এটি এখন পর্যন্ত আমি শুনেছি এটি সেরা সমাধান। আমি মনে করি না যে আমি কীভাবে সঠিক স্রোতটি বিভক্ত করেছি তাতে খুব বেশি গুরুত্বপূর্ণ? প্রাথমিক পিআরএনজি এবং বীজ থেকে কীভাবে বেছে নেওয়া যায় তা উদাহরণগুলির মধ্যে 624 32-বিট পূর্ণসংখ্যায় সদৃশ সিকোয়েন্স পাওয়া অনেক বেশি অসম্ভব বলে মনে হয়।
এরিকআর

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

বা RandomStateবিকাশের ক্ষেত্রে কেবলমাত্র একটি নতুন বাস্তবায়ন ব্যবহার করুন যা স্থায়ী স্থানে থাকা একটি অ্যালগরিদম ব্যবহার করে। এটি হ'ল, আপনি প্রতিটি RandomStateবীজ একই বীজ এবং বিভিন্ন স্ট্রিম আইডি দিয়ে শুরু করেন (কেবলমাত্র বর্ধিত ভাল হয়) এবং আপনি স্বাধীন স্ট্রিমের গ্যারান্টিযুক্ত। pypi.python.org/pypi/randomstate
রবার্ট কর্ন

4

সমান্তরাল প্রক্রিয়াকরণে ব্যবহৃত একটি সমাধান হ'ল আপনার এলোমেলো জেনারেটর ব্যবহার করাΦ(u), কোথায় u আপনার বীজ, দ্বারা N-batches:

  1. জেনারেট Φ(u),ΦN(u),Φ2N(u),...
  2. জেনারেট Φ2(u),Φ1+N(u),Φ1+2N(u),...
  3. ...
  4. জেনারেট ΦN1(u),ΦN1+N(u),ΦN1+2N(u),...

কোথায় Φn(u)=Φ(Φn1(u))। এইভাবে আপনি একটি একক বীজ ব্যবহার করেন এবং আপনার ক্রমগুলি সমস্ত অভিন্ন এবং স্বতন্ত্র।


2

র্যান্ডমজেন নামে একটি পাইথন প্যাকেজ এখন রয়েছে এটি অর্জনের জন্য পদ্ধতি রয়েছে।

এটা তোলে সমর্থন একটি একক বীজ, সেইসাথে এই ধরনের MT19937 যেমন পুরোনো র্যান্ডম সংখ্যা জেনারেটর জন্য জাম্পিং প্রোটোকল থেকে তৈরি স্বাধীন স্ট্রিম।


0

কিছু লোক দাবি করেন যে ক্রমযুক্ত বীজ দ্বারা উত্পাদিত এলোমেলো সংখ্যার মধ্যে পারস্পরিক সম্পর্ক রয়েছে। /programming/10900852/near-seeds-in-random-number-generation-may-give-similar-random-numbers আমি নিশ্চিত না যে এটি কতটা সত্য।

আপনি যদি এটি নিয়ে উদ্বিগ্ন থাকেন তবে কেন অন্য জেনারেটরের সকলের জন্য বীজ বেছে নিতে একক র্যান্ডম নম্বর জেনারেটর ব্যবহার করবেন না?


কেবলমাত্র আমি 1 টিরও বেশি জেনারেটরের জন্য এলোমেলোভাবে একই বীজ উত্পাদন করার কোনও সুযোগ পেতে চাই না। অবশ্যই এটি হওয়ার থেকে রোধ করার জন্য আমি কিছু প্রোগ্রামিংয়ের কাজ করতে পারতাম তবে তবে আমি জানি না যে এটি প্রথম স্থানে ক্রমানুসারে বীজ বাছাইয়ের চেয়ে আরও ভাল কীভাবে হবে।
এরিকআর

1
স্পষ্টতই , অনুক্রমিক বীজগুলির সাথে পারস্পরিক সম্পর্ক সম্ভব ... তবে জন ডি কুকের ব্লগের উত্তরটির সাথে সম্পর্কিত নিবন্ধটি যেমন দেখায় যে, অন্য জেনারেটরের বীজ উত্পাদন করতে একটি আরএনজি ব্যবহার করা অনেক খারাপ, কারণ আপনি জন্মদিনের সমস্যায় পড়ে! এটি বলেছে যে এলোমেলোভাবে 1000 16-বিট স্বাক্ষরযুক্ত বীজ উত্পাদন করার ক্ষেত্রে ওভারল্যাপের 99.95% সম্ভাবনা রয়েছে!
প্রবীণ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.