rand() % n
আদর্শের চেয়ে কম হওয়া সম্পর্কিত
করছেন rand() % n
একটি অ-ইউনিফর্ম বিতরণ আছে। আপনি নির্দিষ্ট মানের একটি অপ্রয়োজনীয় সংখ্যা পাবেন কারণ মান সংখ্যা 20 এর একক নয়
এর পরে, rand()
সাধারণত একটি লিনিয়ার কংগ্রেসনাল জেনারেটর (সেখানে আরও অনেকেই আছেন , সম্ভবত এটি সম্ভবত প্রয়োগ করা হয় - এবং আদর্শ পরামিতিগুলির চেয়ে কম সহ (পরামিতিগুলি নির্বাচন করার বিভিন্ন উপায় রয়েছে))। এর সাথে সবচেয়ে বড় সমস্যাটি হ'ল প্রায়শই এটির মধ্যে কম বিটগুলি (যেগুলি আপনি % 20
টাইপ এক্সপ্রেশন দিয়ে পান) তা এলোমেলো নয়। আমি এক স্মরণ rand()
বছর পূর্বে কোথা থেকে সর্বনিম্ন বিট থেকে alternated 1
করতে 0
প্রতিটি কলের মাধ্যমে rand()
- এটি খুব র্যান্ডম ছিল না।
থেকে রান্ড (3) মানুষ পৃষ্ঠা:
লিনাক্স সি লাইব্রেরিতে র্যান্ড () এবং শ্রান্ড () এর সংস্করণগুলি একই ব্যবহার করে
এলোমেলো নম্বর () এবং শ্রেনডম () হিসাবে এলোমেলো সংখ্যা জেনারেটর, তাই নিম্ন-অর্ডার
বিটগুলি উচ্চ-অর্ডার বিটের মতো এলোমেলো হওয়া উচিত। তবে, পুরানো
র্যান্ড () বাস্তবায়ন এবং বর্তমান বাস্তবায়নে বিভিন্ন different
সিস্টেমগুলি, নিম্ন-অর্ডার বিটগুলি উচ্চতর- এর চেয়ে অনেক কম এলোমেলো হয়
অর্ডার বিট হওয়ার উদ্দেশ্যে থাকা অ্যাপ্লিকেশনগুলিতে এই ফাংশনটি ব্যবহার করবেন না
পোর্টেবল যখন ভাল এলোমেলো প্রয়োজন হয়।
এটি এখন ইতিহাসে ছড়িয়ে যেতে পারে, তবে এটি সম্ভবত সম্ভব যে আপনি এখনও একটি দুর্বল র্যান্ড () বাস্তবায়ন স্তরের কোনও জায়গায় লুকিয়ে রেখেছেন। কোন ক্ষেত্রে এটি এখনও যথেষ্ট প্রযোজ্য।
করণীয় হ'ল আসলে একটি ভাল এলোমেলো নম্বর লাইব্রেরি ব্যবহার করা (যা ভাল এলোমেলো নম্বর দেয়) এবং তারপরে আপনি যে পরিসীমা চান তার মধ্যে এলোমেলো সংখ্যা জিজ্ঞাসা করুন।
কোডের একটি ভাল এলোমেলো সংখ্যার উদাহরণ (লিঙ্কযুক্ত ভিডিওতে 13:00 থেকে)
#include <iostream>
#include <random>
int main() {
std::mt19937 mt(1729); // yes, this is a fixed seed
std::uniform_int_distribution<int> dist(0, 99);
for (int i = 0; i < 10000; i++) {
std::cout << dist(mt) << " ";
}
std::cout << std::endl;
}
এর সাথে তুলনা করুন:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand(time(NULL));
for (int i = 0; i < 10000; i++) {
printf("%d ", rand() % 100);
}
printf("\n");
}
এই উভয় প্রোগ্রাম চালান এবং তুলনা করুন যে আউটপুটে কতগুলি নির্দিষ্ট সংখ্যা আসে (বা আসে না) কতবার।
সম্পর্কিত ভিডিও: র্যান্ড () ক্ষতিকারক হিসাবে বিবেচিত
র্যাণ্ডের কিছু aspectsতিহাসিক দিকগুলি () নেথাকের মধ্যে বাগ তৈরি করে যা কারও নিজস্ব বাস্তবায়ন দেখে এবং বিবেচনা করা উচিত:
নেটহ্যাক আরএনজি সমস্যা
র্যান্ড () নেটহ্যাকের এলোমেলো সংখ্যা জেনারেশনের জন্য খুব মৌলিক কাজ function নেটহ্যাক যেভাবে এটি ব্যবহার করে তা বগি বা এটি যুক্তিযুক্ত হতে পারে যে ল্যান্ডেন্ড 48 () ক্রপী সিউডো-এলোমেলো সংখ্যা তৈরি করে। (তবে, ল্যান্ড্যান্ড 48 () একটি সংজ্ঞায়িত পিআরএনজি পদ্ধতি ব্যবহার করে একটি লাইব্রেরি ফাংশন এবং যে কোনও প্রোগ্রাম এটি ব্যবহার করে সেই পদ্ধতির দুর্বলতাগুলি বিবেচনায় নেওয়া উচিত))
ত্রুটিটি হল যে ল্যান্ড্যান্ড 48 () থেকে প্রাপ্ত ফলাফলগুলির নীচের বিটগুলিতে নেট্যাক নির্ভর করে (কখনও কখনও একচেটিয়াভাবে যেমন rn (2) তেমন নির্ভর করে)। এই কারণে, পুরো গেমের আরএনজি খারাপ কাজ করে। এটি ব্যবহারকারীর ক্রিয়াগুলি আরও এলোমেলোতার অর্থাত্ চরিত্র উত্পন্নকরণ এবং প্রথম স্তরের সৃষ্টির আগে উল্লেখযোগ্য।
উপরের অংশটি ২০০৩ সাল থেকে হওয়া সত্ত্বেও এটি এখনও মনে রাখা উচিত কারণ আপনার লক্ষ্যযুক্ত গেমটি চালিত সমস্ত সিস্টেমে একটি ভাল র্যান্ড () ফাংশন সহ একটি আপ টু ডেট লিনাক্স সিস্টেম হতে পারে।
যদি আপনি কেবল নিজের জন্য এটি করছেন, আপনি কিছু কোড লিখে এনট দিয়ে আউটপুট পরীক্ষা করে আপনার র্যান্ডম নম্বর জেনারেটরটি কতটা ভাল তা পরীক্ষা করতে পারেন ।
এলোমেলো সংখ্যার বৈশিষ্ট্যগুলিতে
'এলোমেলো' এর অন্যান্য ব্যাখ্যা রয়েছে যা একেবারে এলোমেলো নয়। ডেটা এলোমেলো স্ট্রিমে, একই সংখ্যাটি দু'বার পাওয়া বেশ সম্ভব। আপনি যদি একটি মুদ্রা (এলোমেলো) ফ্লিপ করেন তবে একটানা দুটি মাথা পাওয়া সম্ভব। অথবা দু'বার পাশা নিক্ষেপ করুন এবং একই সংখ্যাটি পরপর দু'বার পান। বা একটি রুলেট হুইল স্পিনিং এবং একই বার দুটি একই নম্বর পেয়ে।
সংখ্যা বিতরণ
গানের তালিকাগুলি খেলতে গিয়ে লোকেরা 'এলোমেলো' এর অর্থ প্রত্যাশা করে যে একই গান বা শিল্পীকে পর পর দ্বিতীয়বার বাজানো হবে না। একটি প্লেলিস্ট পরপর দুইবার দ্য বিট্লস খেলা বলে মনে করা হয় হচ্ছে 'দৈব না' (যদিও এটা হল র্যান্ডম)। চারটি গানের একটি প্লে তালিকার জন্য মোট আটবার পঠিত ধারণাটি:
1 3 2 4 1 2 4 3
এর চেয়ে বেশি 'এলোমেলো':
1 3 3 2 1 4 4 2
গানের 'পরিবর্তন' এর জন্য আরও এটি: গানগুলি কীভাবে বদলানো যায় ?
পুনরাবৃত্তি মান
আপনি যদি মানগুলি পুনরাবৃত্তি করতে না চান, তবে আলাদা ধারণা রয়েছে যা বিবেচনা করা উচিত। সমস্ত সম্ভাব্য মান উত্পন্ন করুন এবং এগুলি পরিবর্তন করুন।
আপনি যদি কল করছেন rand()
(বা অন্য কোনও এলোমেলো নম্বর জেনারেটর), আপনি এটি প্রতিস্থাপনের সাথে কল করছেন। আপনি সর্বদা দুবার একই নম্বর পেতে পারেন। একটি বিকল্প হ'ল মানগুলি বার বার টস করা যতক্ষণ না আপনি নিজের প্রয়োজনীয়তা পূরণ করে এমন একটি নির্বাচন না করেন। আমি এটি উল্লেখ করব যে এটির একটি অ-সংক্ষেপণমূলক রানটাইম রয়েছে এবং আপনি আরও জটিল ব্যাক ট্রেসিং করা শুরু না করলে আপনি নিজেকে এমন পরিস্থিতিতে আবিষ্কার করতে পারেন যেখানে অসীম লুপ থাকে।
তালিকা এবং বাছাই করুন
অন্য বিকল্পটি হ'ল সমস্ত সম্ভাব্য বৈধ রাজ্যের একটি তালিকা তৈরি করা এবং তারপরে সেই তালিকা থেকে একটি এলোমেলো উপাদান নির্বাচন করা। ঘরে খালি সমস্ত দাগ (যা কিছু নিয়মের সাথে মিলিত হয়) সন্ধান করুন এবং তারপরে সেই তালিকা থেকে একটি এলোমেলো চয়ন করুন। এবং আপনার কাজ শেষ না হওয়া পর্যন্ত এটি বার বার করুন।
অদলবদল
অন্য পদ্ধতিটি এমনভাবে বদলে যায় যেন এটি কার্ডের ডেক cards সাথে শুরু সব রুমে খালি দাগ এবং তারপর একটি সময়ে খালি দাগ, এক আউট আচরণ, প্রতিটি নিয়ম / প্রক্রিয়া একটি খালি স্পট চাওয়ার জন্য তাদের বরাদ্দ শুরু। আপনার কার্ড শেষ হয়ে গেলে বা জিনিসগুলি তাদের কাছে জিজ্ঞাসা করা বন্ধ করে দিলে আপনার কাজ শেষ হয়ে যায়।