সি ++ এ এলোমেলো সংখ্যা


12

সম্প্রতি আমি আধুনিক ভাষায় অভ্যস্ত হয়েছি যার মধ্যে স্টক ভাল র্যান্ডম জেনারেটর অন্তর্ভুক্ত রয়েছে, যা সাধারণত মার্সেন টুইস্টার; এখন যে আমি আবার সি ++ এ ফিরে এলাম আমাকে কী ব্যবহার করবেন তা সিদ্ধান্ত নিতে হবে।

আমি মার্সেন টুইস্টার বাস্তবায়নগুলি অনুসন্ধান করেছিলাম এবং লক্ষ্য করেছি যে সেখানে প্রচুর পরিমাণ রয়েছে: এমন কি আছে যা বেশি ব্যবহৃত হয় এবং বিস্তৃত হয়, বা আমার মনে হয় যে তারা সবাই সমানভাবে ভাল?


1
আমি আপনার সি ++ এবং আধুনিক ভাষার পৃথকীকরণ পছন্দ করি।
jcora

2
সম্ভবত "উচ্চতর স্তর" বলা আরও উপযুক্ত ছিল।
o0 '

আমি মনে করি এই প্রশ্নটি
স্ট্যাকওভারফ্লোতে অন্তর্ভুক্ত

5
সুতরাং আমি অন্যরকম উত্তর দেব কারণ আমি জানতাম না যে এটি কোনও গেম ইঞ্জিনের বিপরীতে হিসাবে ছিল, বলুন, চিকিত্সা চিকিত্সার জন্য মন্টে কার্লো সিমুলেশনগুলির ক্ষেত্রে, যথেচ্ছ এলোমেলোতার 624 মাত্রা না থাকা মারাত্মক হতে পারে।

উত্তর:


19

সি ++ 11 এর ডিফল্টরূপে তার নতুন <random>ইন্টারফেসের অংশ হিসাবে একটি মার্সেন টুইস্টার জেনারেটর অন্তর্ভুক্ত । উদাহরণস্বরূপ, এমটি ব্যবহার করে [-10, 10] এর মধ্যে সমানভাবে পূর্ণসংখ্যার উত্পাদন করা:

std::mt19937 eng; // This is the Mersenne Twister
std:::uniform_int_distribution<int> dist(-10, 10)
for (int i = 0; i < 10; ++i)
    std::cout << dist(eng) << std::endl;

নামগুলির কিছুটা আলাদা হলেও এর বেশিরভাগ টিআর 1 প্রদানের যে কোনও সংকলকটিতেও পাওয়া যায়; std::tr1::mt19937এবং std::tr1::uniform_int<int>

আমি সাধারণত মানুষকে মার্সেন টুইস্টার ব্যবহার থেকে দূরে রাখতে সাবধান করি। এটি একটি ঠিক আছে অ্যালগরিদম তবে এর প্রচুর জনপ্রিয়তা কেবল বিপণন। এলোমেলোতার 624 মাত্রা বেশিরভাগ মানুষের প্রয়োজনের চেয়ে বেশি, এবং এমটি তুলনামূলকভাবে ভারী রাষ্ট্রীয় প্রয়োজনীয়তা বহন করে এবং যখন এটি একটি পূর্ণ টেবিলটি পুনরায় স্বীকৃতি দেয় তখন এটি ক্যাশে ফুঁকতে পারে। আমি ব্যক্তিগতভাবে xorshift এ আংশিক , যা ক্ষুদ্র স্মৃতি এবং সিপিইউ প্রয়োজনীয়তার সাথে একটি গেমের প্রয়োজনের জন্য দুর্দান্ত সময়সীমা এবং যুক্তিসঙ্গত বিতরণ দেয়।

আমি (? বেশিরভাগই) সি ++ 11 অনুবর্তী xorshift জেনারেটরের লিখেছি - xorshift.hpp , xorshift.cpp - এবং পাবলিক ডোমেইনে সেটিকে রাখে। আপনি উপরের মতো যেকোন সি ++ র্যান্ডমাইজেশন ফাংশনে প্লাগ করতে পারেন:

xorshift eng;
std:::uniform_int_distribution<int> dist(-10, 10)
for (int i = 0; i < 10; ++i)
    std::cout << dist(eng) << std::endl;

5
হ্যাঁ, আমি যে ধরণের উত্তরটি সন্ধান করছিলাম এটি সে কারণেই আমি এখানে গেমদেব:)
o0

1
কেবলমাত্র নোট করতে চেয়েছিলেন যে আপনি সংযুক্ত ফাইলগুলির কোনও কিছুই সেগুলি পাবলিক ডোমেনে নেই তা বোঝায়। কপিরাইট আইন যেভাবে কাজ করে, সে সম্পর্কে সত্যই একটি স্পষ্ট নোট থাকা দরকার, কেননা আইনটি ডিফল্টরূপে "সমস্ত অধিকার সংরক্ষণ" করে। এটি এমআইটি বা বিএসডি ২-ক্লজ লাইসেন্সের মতো কিছু ব্যবহার করা আরও নিরাপদ, যেহেতু কিছু এখতিয়ার মূলত "এটি পাবলিক ডোমেনে রয়েছে" আইনত বাধ্যতামূলক হিসাবে স্বীকার করে না। লোকেরা আপনার কোডটি ব্যবহার করে দেখতে যদি আপনি আগ্রহী হন তবে এটির যত্ন নেওয়া ভাল।
শান মিডলডিচ

1
@ সানমিডলিচ: আমি এখনই এ সম্পর্কে পরিষ্কার হয়েছি। আপনি যদি এটি এমআইটি-স্টাইল লাইসেন্সের আওতায় চান, আমি এসকিউএলাইটের সীসা অনুসরণ করব এবং তা আপনাকে কেবলমাত্র $ 1000 এর জন্য দেব।

কোডে কোনও শিরোনাম (এসকিউএলাইট যা করে, iirc) তার প্রধান সমস্যা হ'ল। আপনি যদি যত্ন না করেন, এটি দুর্দান্ত। আপনাকে কেবল একটি বন্ধুত্বপূর্ণ পরামর্শ দিচ্ছিলাম।
শান মিডলডিচ

1

গেমদেবের উদ্দেশ্যে আমি আর আরএনজি আগে ব্যবহার করেছি হ'ল এখানে বর্ণিত বব জেনকিন্সের "ছোট" আরএনজি ।

(আইসএএসি নামক একটি ক্রিপ্টোগ্রাফিক শক্তি আরএনজিও রয়েছে তবে এটি আরও বড় এবং ধীর এবং গেমসের সেই স্তরের শক্তির প্রয়োজন নেই don't)


1
এটি xorshift (4 xors এবং 3 শিফট বনাম 4 যোগ, 6 শিফট, 2 বছর, এবং একটি xor) এর চেয়ে ব্যয়বহুল দেখাচ্ছে, এর আরও খারাপ সময়কাল রয়েছে এবং নির্দিষ্ট সূচনা দিয়ে খুব সংক্ষিপ্ত চক্রের ঝুঁকি চালায়। এটি দ্রুত দেখায় তবে দ্রুত নয়; ঠিক আছে পিরিয়ড তবে কোথাও অনুকূলের কাছাকাছি নয়; xorshift হিসাবে একই বুনিয়াদি বিতরণ গুণাবলী; আমি এটি ব্যবহার করার কোনও কারণ দেখতে পাচ্ছি না।

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