কেন সি ++ র‌্যান্ড () একই মাত্রার মাত্রার সংখ্যার উত্পন্ন বলে মনে হচ্ছে?


146

সি / সি ++ তে লেখা একটি ছোট্ট অ্যাপ্লিকেশনটিতে, আমি randফাংশন এবং সম্ভবত বীজের সাথে সমস্যার মুখোমুখি হয়েছি :

আমি এলোমেলো সংখ্যার একটি ক্রম উত্পাদন করতে চাই যা বিভিন্ন অর্ডারের, অর্থাত্ বিভিন্ন লোগারিদম মান (বেস 2) সহ। তবে দেখে মনে হচ্ছে যে উত্পাদিত সমস্ত সংখ্যা একই ক্রমের, কেবল 2 ^ 25 এবং 2 ^ 30 এর মধ্যে ওঠানামা করে।

এটি কি rand()ইউনিক্স সময়ের সাথে বদ্ধ হয় যা এখন তুলনামূলকভাবে বড় সংখ্যায় রয়েছে? আমি কি ভুলে যাচ্ছি? আমি rand()একবারের শুরুতে বীজ বপন করছি main()


7
FWIW তাই, এটি সি বা সি ++? যদি সি / সি ++ এর মাধ্যমে আপনি বোঝাতে চেয়েছেন যে আপনি প্রকৃতপক্ষে সি ++ ব্যবহার করতে পারেন, এবং সি এর উল্লেখটি কেবল এলোমেলো ছিল, সম্ভবত এই en.cppreferences.com/w/cpp/numeric/random/binomial_dist تقسیم সহায়তা করতে পারে।
আর মার্টিনহো ফার্নান্দিস

9
দুর্ভাগ্যক্রমে আপনি ভুল ঘোড়ায় বাজি ধরেছিলেন। বীজ আপনার সমস্যা হওয়া উচিত নয়। আপনার সমস্যাটি ভুল প্রত্যাশিত বিতরণ ছিল। যেহেতু নিরপেক্ষ প্রগতিশীল rand()সমানভাবে বিতরণ করা সংখ্যাগুলি প্রত্যাশা করবে (উচ্চ গুগল র‌্যাঙ্কিংয়ের সাথে ডকুমেন্টেশন স্পষ্টভাবে বলেছে) আমি ভাবি না যে এই প্রশ্নটি ভবিষ্যতের পাঠকদের জন্য কার্যকর। এ কারণেই ভোট কমিয়ে দিন তবে এটি আপনাকে এসও ব্যবহার করতে নিরুৎসাহিত করবেন না।
সম্রাট ওরিওনি

12
@ doug65536 "... যেখানে কোনও সংখ্যার পুনরাবৃত্তি হয় না" - এটি এলোমেলো নয়! আমি আমার অবসর গ্রহণের জন্য ক্রপ টেবিলের তহবিল দিতে পারি যদি আমার সম্ভাব্য নম্বর ফিরে না পাওয়া পর্যন্ত আমার র্যান্ড () ডাইস কখনই একই সংখ্যাটি দুবার না ফেরায়।
ক্রিস গ্রেগ

6
@ গ্যালাকটিক কাউবয় পৃথক সংখ্যার পুনরাবৃত্তি সঙ্গে পর্যায়ক্রমে ভুল করবেন না। উইকিপিডিয়া নিবন্ধ থেকে আপনি উদ্ধৃত করেছেন: "পুনরাবৃত্ত ফলাফলের দ্বারা বোঝা যায় না যে সময়কালের সমাপ্তি পৌঁছেছে, যেহেতু এর অভ্যন্তরীণ অবস্থা তার আউটপুটের চেয়ে বড় হতে পারে।" এটি খুব খুব খারাপ হবে যদি কোনও পিআরএনজি কোনও মান উত্পাদন করে এবং তারপরে সমস্ত মান ফিরে না পাওয়া পর্যন্ত সেই মানটি আবার না উত্পাদন করার গ্যারান্টিযুক্ত হয়।
ক্রিস গ্রেগ

12
ডগ 65536, কেউ মারামারি বাছাই করছে না। তারা ঠিক বলেছেন যে আপনি ভুল। একটি পিআরএনজি খুব খুশি হয়ে নীচে মন্থন করতে পারে যদি আমি 1 এবং 10: 2 4 7 2 8 1 1 9 7 3 এর মধ্যে কোনও র‌্যান্ড চাই, এটি একাধিক 2 এবং 7 সত্ত্বেও পুরোপুরি বৈধ হবে। আমি মনে করি আপনি আপনার আইফোনে পরিবর্তন সংক্রান্ত সুবিধায় PRNG গুলিয়ে ফেলছেন।
সাইপ্রাসে

উত্তর:


479

1 এবং 2 30 এর মধ্যে কেবল 3% সংখ্যা রয়েছে যা 2 25 এবং 2 30 এর মধ্যে নয় । সুতরাং, এটি বেশ স্বাভাবিক মনে হচ্ছে :)

কারণ 2 25 /2 30 = 2 -5 = 1/32 = 0.03125 = 3.125%


36
হাই, ভাল পয়েন্ট! 1 এবং 2 ^ 25 এর মধ্যে 2 ^ 25 এবং 2 ^ 30 এর মধ্যে 31 গুণ বেশি সংখ্যা রয়েছে :) দ্রুত উত্তরের জন্য ধন্যবাদ। আমি তখন প্রোগ্রামটি পুনর্বিবেচনা করা প্রয়োজন। প্রশ্নের উত্তর।
টালরন ম্যাথিয়াস

1
@ ট্যালারন ম্যাথিয়াস বিট শিফটিংয়ের মাধ্যমে >>সংখ্যাটি কাটা বিবেচনা করুন - এটি আপনাকে আরও ছোট সংখ্যা দেবে। (বা এর সাথে একটি মডুলাস নিচ্ছে %))
সান অলরেড

13
আমি এটি বেশিরভাগ প্রোগ্রামারদের কাছে প্রত্যাশিত প্রত্যাশা করব: 2 ^ 25 এর চেয়ে কম স্বাক্ষরযুক্ত পূর্ণসংখ্যার অবশ্যই তার প্রথম 7 টি বিট সমান হতে হবে 0- এবং যদি প্রতিটি বিট এলোমেলো হয় ...
ব্লুরাজা - ড্যানি পিফ্লুঘুফুট

118
@ ব্লুরাজা-ড্যানিপ্লুঘুফুট - যদি সম্ভাবনাগুলি স্পষ্ট হয় তবে ক্যাসিনোগুলি ব্যবসায়ের বাইরে থাকত।
ব্রেট হ্যালে

26
@ ব্র্যাটহেল - আমি মনে করি না প্রোগ্রামাররা যদিও ক্যাসিনোর টার্গেট ডেমোগ্রাফিক।
একুস্টিকমার্টিন

272

হালকা সবুজ 0 এবং 2 25 এর মধ্যে অঞ্চল ; গা green় সবুজ 2 25 এবং 2 30 এর মধ্যে অঞ্চল । টিকগুলি 2 এর শক্তি powers

বিতরণ


42

আপনার আরও সুনির্দিষ্ট হওয়া দরকার: আপনি বিভিন্ন বেস 2 লোগারিদম মান চান তবে এর জন্য আপনি কী বিতরণ চান? স্ট্যান্ডার্ড র‌্যান্ড () ফাংশনগুলি একটি অভিন্ন বিতরণ জেনারেট করে, আপনি যে বিতরণটি চান তার সাথে যুক্ত কোয়ান্টাইল ফাংশনটি ব্যবহার করে আপনাকে এই আউটপুটটি রূপান্তর করতে হবে ।

আপনি যদি আমাদের বিতরণ জানান তবে আমরা quantileআপনার প্রয়োজনীয় ফাংশনটি আপনাকে বলতে পারি ।


13
+1, বিতরণ গুরুত্বপূর্ণ শব্দ। যখন বিতরণ সম্পর্কে কিছুই জানা যায় না তখন এলোমেলো সংখ্যার বিষয়ে কথা বলার অর্থ হয় না। ইউনিফর্মটি একটি বিশেষ ক্ষেত্রে, যদিও এটি একটি গুরুত্বপূর্ণ বিষয়। সি ++ 11 স্ট্যান্ডার্ড লাইব্রেরি থেকে বিভিন্ন বিতরণ উল্লেখ করার জন্য ভাল জায়গা হতে পারে।
বাম দিকের বাইরে

18

আপনি যদি আকারের বিভিন্ন আদেশ চান, তবে কেন কেবল চেষ্টা pow(2, rand())করবেন না ? অথবা সম্ভবত অর্ডারটি সরাসরি র্যান্ড () হিসাবে চয়ন করুন, হ্যারল্ডের পরামর্শ মতো?


3
ভাল ধারণা, তবে আপনার উত্তরটি ^ এর পরিবর্তে পা ব্যবহার করে ঠিক করা উচিত (যা সি ভাষায় পাওয়ার নয়, লজিকাল জোর অপারেটর)।
ক্রিস

6
যেহেতু rand()উপরে যেতে পারে RAND_MAX, ফলস্বরূপ ফলটি প্রবাহিত না হয় তাই আপনাকে অবশ্যই আপনার এলোমেলো সংখ্যাটি স্কেল করতে হবে ...
ফ্লোরিস

@ ফ্লোরিস: তবে আপনি যদি খুব বড় পরিসরে একটি ছোট গণনাযোগ্য পরিসর স্কেল করেন তবে আপনার প্রচুর গর্ত হবে, যা সম্ভবত ওপি আশা করে না।
আন্দ্রে কারন

13

@ সি 4 স্টোর একটি দুর্দান্ত পয়েন্ট দিয়েছে। তবে, আরও সাধারণ ক্ষেত্রে এবং সহজে মানুষের জন্য বোঝার জন্য (বেস 10): 1 থেকে 10 ^ n এর পরিসরের জন্য, ~ 90% সংখ্যা 10 ^ (এন -1) থেকে 10 ^ n, সুতরাং, ~ 99% সংখ্যা 10 ^ (n-2) থেকে 10 ^ n এ চলে যায়। যত খুশি দশমিক যোগ করতে থাকুন।

মজার গণিত, আপনি যদি n এর জন্য এটি চালিয়ে যান তবে আপনি দেখতে পারেন যে 1 থেকে 10 ^ n, 99.9999 ...% = 100% সংখ্যা এই পদ্ধতিতে 10 ^ 0 থেকে 10 from n এর মধ্যে।

এখন কোড সম্পর্কে, আপনি যদি 0 থেকে 10 from n অবধি র্যান্ডম অর্ডার সহ একটি এলোমেলো সংখ্যা চান তবে আপনি এটি করতে পারেন:

  1. 0 থেকে এন পর্যন্ত একটি ছোট এলোমেলো সংখ্যা তৈরি করুন

  2. আপনি যদি এন এর পরিসীমা সম্পর্কে জানেন তবে 10 ^ কে যেখানে k> সর্বাধিক {n order সেখানে একটি বড় এলোমেলো সংখ্যা তৈরি করুন}

  3. এই বড় এলোমেলো সংখ্যার এন সংখ্যাগুলি পেতে দীর্ঘ এলোমেলো সংখ্যাটি কেটে ফেলুন।


46
আপনি সম্পূর্ণরূপে সঠিক, তবে উত্তরটি সহজেই বোঝার জন্য, ওপিকে নিজেকে জিজ্ঞাসা করা উচিত যে 1 থেকে 100 এর মধ্যে এলোমেলো সংখ্যাগুলির 90% কেন দুটি সংখ্যার।
মনিকা

13

প্রাথমিক (এবং সঠিক) উত্তরটি ইতিমধ্যে উপরে দেওয়া এবং গ্রহণ করা হয়েছিল: 0 থেকে 9 এর মধ্যে 10 নম্বর রয়েছে, 10 থেকে 99 এর মধ্যে 90 সংখ্যা, 100 থেকে 999 এর মধ্যে 900 রয়েছে ইত্যাদি।

আনুমানিক লগারিদমিক বিতরণ সহ একটি বিতরণ পাওয়ার জন্য গণনামূলক দক্ষতার জন্য আপনি একটি এলোমেলো সংখ্যায় আপনার এলোমেলো সংখ্যাটি ডান-শিফট করতে চান:

s = rand() & 31; // a random number between 0 and 31 inclusive, assuming RAND_MAX = 2^32-1
r = rand() >> s; // right shift

এটি নিখুঁত নয়, তবে এটি কম্পিউটিংয়ের চেয়ে অনেক দ্রুত pow(2, rand()*scalefactor)। এটি "গলদা" এই অর্থে হবে যে বিতরণটি একটি ফ্যাক্টর 2 এর মধ্যে সংখ্যার জন্য সমান হবে (128 থেকে 255 এর জন্য ইউনিফর্ম, 256 থেকে 1023 এর জন্য অর্ধ ঘনত্ব ইত্যাদি)।

এখানে 0 থেকে 31 সংখ্যার ফ্রিকোয়েন্সিটির একটি হিস্টগ্রাম রয়েছে (1 এম নমুনায়):

এখানে চিত্র বর্ণনা লিখুন


নিতপিক: এটি খুব কম সংখ্যককে উত্সাহ দেয় যা একজনের চেয়ে বেশি আশা করে। একটি শূন্য পাবার সম্ভাবনা 10 একটি তুলনায় উল্লেখযোগ্যভাবে বেশী
গরুর হাঁসের

ঠিক আছে - এর পুরো বিষয়টি হ'ল ছোট সংখ্যাকে উত্সাহিত করা, সুতরাং আমি আনন্দিত এটি কাজ করছে! আমি একটি মন্টি কার্লো সিমুলেশন চালিয়েছি, এবং এটি আমাকে সংখ্যার দ্বিগুণ হিসাবে সম্ভাবনার 2 গুণ কমিয়ে দিচ্ছে - লগ বিতরণের মত নয়। একটি ছবি সহ উত্তর আপডেট করুন।
ফ্লোরিস

না, আমি বোঝাতে চাইছি, rand()>>(rand()&31);সংখ্যার 1/32 তমটি 32 বিট থাকতে হবে এবং সংখ্যার 1/32 তমতে 31 বিট থাকবে এবং সংখ্যার 1/32 তম থাকবে 30 বিট, ইত্যাদি। তবে এটি না ফলাফল আপনি পেয়ে থাকেন, মাত্র 1 তুলনায় সম্পর্কে / সংখ্যার 64 তম 32 বিট স্থাপিত হবে, যখন প্রায় অর্ধেক 0. আপনার পরিমাপ সঙ্গে আমার মানসিক গণিত একমত নন যেহেতু হওয়া উচিত, আমি চিত্র আমার নিজের পরিমাপ করতে হবে এটা বাইরে.
মাকিং হাঁস

2
আমি বলতে চাইছি না যে আপনার কোডটি ভুল। এটা সম্ভবত আমি কি করব। এটি শুধু একটি সতর্কবার্তা যে ফলাফল নেই দাবী বেশ হিসাবে আশা করতে পারে বিতরণ করেন।
মাকিং হাঁস

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

5

0 এবং 2 ^ 29 এবং 2 ^ 29 এবং 2 ^ 30 এর মধ্যে ঠিক সমান সংখ্যার সংখ্যা রয়েছে।

সমস্যাটি দেখার অন্য একটি উপায়: আপনি যে এলোমেলো সংখ্যার উত্পন্ন করেন তার দ্বৈত প্রতিনিধিত্ব বিবেচনা করুন, সর্বোচ্চ বিটটি 1 এর সমান হওয়ার সম্ভাবনা 1/2 এর সমান এবং তাই, অর্ধের ক্ষেত্রে আপনি অর্ডার 29 পান। আপনি যা চান তা এমন কোনও সংখ্যাটি দেখতে পাওয়া যা 2 ^ 25 এর নীচে হবে তবে এর অর্থ 5 টি সর্বোচ্চ বিটগুলি সমস্ত শূন্য যা 1/32 এর কম সম্ভাবনার সাথে ঘটে। সম্ভাবনাগুলি হ'ল আপনি যদি এটি দীর্ঘ সময়ের জন্য চালিত হন তবে আপনি কখনই 15 এর নীচের ক্রমটি দেখতে পাবেন না (সম্ভাবনাটি পরপর 6 বার বার ঘূর্ণায়মানের মতো)।

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


2

pow(2,rand()) এটি পছন্দসই পরিমাণের ক্রম উত্তর দেবে ব্যবহার করুন !!


2

আপনি যদি কোনও অনলাইন পরিষেবা থেকে এলোমেলো নম্বর ব্যবহার করতে চান তবে এর জন্য আপনি উইজেটটি ব্যবহার করতে পারেন, আপনি দেখতে চান যে আপনি নিজের র্যান্ডম নম্বর প্রজন্মের জন্য র্যান্ডম.আর.এস. এর মতো পরিষেবাগুলিও ব্যবহার করতে পারেন, আপনি সেগুলি উইজেট ব্যবহার করে এবং তারপরে নম্বরগুলি পড়তে পারেন ডাউনলোড ফাইল

wget -q https://www.random.org/integers/?num=100&min=1&max=100&col=5&base=10&format=html&rnd=new -O new.txt

http://programmingconsole.blogspot.in/2013/11/a-better-and-different-way-to-generate.html


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