আমি কেন ven RANDOM ব্যবহার করার পরে অসম ছড়িয়ে ফলাফল পাচ্ছি?


14

আমি উইকিপিডিয়ায় আরএনজি সম্পর্কে পড়েছি এবং টিএলডিপিতে$RANDOM ফাংশন করেছি তবে এটি সত্যই এই ফলাফলটি ব্যাখ্যা করে না:

$ max=$((6*3600))
$ for f in {1..100000}; do echo $(($RANDOM%max/3600)); done | sort | uniq -c
  21787 0
  22114 1
  21933 2
  12157 3
  10938 4
  11071 5

প্রায় 2x ওপরের মানগুলি কেন 0, 1, 2 3, 4, 5 এর চেয়ে বেশি ঝুঁকছে তবে আমি যখন সর্বাধিক মডুলো পরিবর্তন করি তখন তারা প্রায় 10 টি মানের মধ্যে সমানভাবে ছড়িয়ে যায়?

$ max=$((9*3600))
$ for f in {1..100000}; do echo $(($RANDOM%max/3600)); done | sort | uniq -c
  11940 0
  11199 1
  10898 2
  10945 3
  11239 4
  10928 5
  10875 6
  10759 7
  11217 8

9
এর সাধারণ উত্তরটি হ'ল পুনরায় তালিকাভুক্ত করা (আপনি যে নম্বরটি পেয়েছেন তা ফেলে দিন এবং অন্যটিকে বাছাই করুন) যদি আপনি র‌্যান্ডমের সর্বাধিক মান এবং সর্বোচ্চ সম্ভাব্য মানের মধ্যে যা আপনার মডুলোর মধ্যে সমানভাবে বিভক্ত করতে পারে between এটি সাধারণ-থেকে-র‌্যান্ডোম নয়, এটি সমস্ত ভাষা / সরঞ্জাম / ইত্যাদি জুড়ে সাধারণ-থেকে-মডুলো-টু-সীমাবদ্ধ-আরএনজি-ডোমেন । এই জাতীয় আরএনজি প্রয়োগ করছে
চার্লস ডাফি

7
আপনি কতটা খারাপ হয়ে যায় তার কিছু চমৎকার গ্রাফ চাইলে এই পক্ষপাতের উত্সটি সম্পর্কে আমার 2013 এর নিবন্ধটি দেখুন: ericlippert.com/2013/12/16/…
এরিক লিপার্ট

1
"এলোমেলো সংখ্যার জেনারেশনটি সুযোগে রেখে যাওয়া খুব গুরুত্বপূর্ণ" " - রবার্ট কোভ্যু যদিও এফওয়াইআই: বেশিরভাগ প্রোগ্রাম সত্যই এলোমেলো সংখ্যা তৈরি করতে অক্ষম
জেসি_বি

@ এরিক লিপার্ট আপনাকে ধন্যবাদ, আমি এটি আনন্দের সাথে পড়ব!
সিআরএনএন

1
নোট করুন, যদিও আপনি মডুলো পক্ষপাতের কারণে সমস্যাগুলি দেখছেন, $RANDOMভেরিয়েবল অভ্যন্তরীণভাবে কোনও ভাল পিআরএনজি ব্যবহার করে না
ফরেস্ট

উত্তর:


36

মডুলো পক্ষপাতমূলক বিষয়ে প্রসারিত করতে আপনার সূত্রটি হ'ল:

max=$((6*3600))
$(($RANDOM%max/3600))

এবং এই সূত্রে, $RANDOM0-32767 রেঞ্জের একটি এলোমেলো মান।

   RANDOM Each time this parameter is referenced, a random integer between
          0 and 32767 is generated.

এটি সম্ভাব্য মানগুলিতে কীভাবে এই মানচিত্রগুলিকে কল্পনা করতে সহায়তা করে:

0 = 0-3599
1 = 3600-7199
2 = 7200-10799
3 = 10800-14399
4 = 14400-17999
5 = 18000-21599
0 = 21600-25199
1 = 25200-28799
2 = 28800-32399
3 = 32400-32767

সুতরাং আপনার সূত্রে, 0, 1, 2 এর সম্ভাবনা 4, 5 এর দ্বিগুণ এবং 3 টির সম্ভাবনাও 4, 5 এর চেয়ে কিছুটা বেশি। সুতরাং আপনার ফলাফল 0, 1, 2 বিজয়ী হিসাবে এবং 4, 5 পরাজিত হিসাবে।

এ পরিবর্তন করার সময় 9*3600, এটি হিসাবে সক্রিয়:

0 = 0-3599
1 = 3600-7199
2 = 7200-10799
3 = 10800-14399
4 = 14400-17999
5 = 18000-21599
6 = 21600-25199
7 = 25200-28799
8 = 28800-32399
0 = 32400-32767

1-8 এর একই সম্ভাবনা রয়েছে তবে 0 এর জন্য সামান্য পক্ষপাত রয়েছে এবং তাই 0 এখনও 100'000 পুনরাবৃত্তি সহ আপনার পরীক্ষায় বিজয়ী ছিলেন।

মডুলো পক্ষপাতিত্ব ঠিক করতে, আপনার প্রথমে সূত্রটি সহজ করতে হবে (যদি আপনি কেবল 0-5 চান তবে মডুলোটি 6, 3600 বা এমনকি ক্রেজিয়ার সংখ্যা নয়, এটির কোনও ধারণা নেই)। এই সরলকরণটি আপনার পক্ষপাতিত্বকে অনেকটা কমাবে (32766 মানচিত্র 0, 32767 থেকে 1 এ দুটি সংখ্যাকে ছোট পক্ষপাত প্রদান করবে)।

পক্ষপাত পুরোপুরি পরিত্রাণ পেতে, আপনাকে পুনরায় রোল করতে হবে (উদাহরণস্বরূপ) যখন $RANDOMকম থাকে 32768 % 6(যে সমস্ত রাজ্যগুলি উপলভ্য এলোমেলো ব্যাপ্তিতে পুরোপুরি মানচিত্র দেয় না) তা নির্মূল করুন।

max=6
for f in {1..100000}
do
    r=$RANDOM
    while [ $r -lt $((32768 % $max)) ]; do r=$RANDOM; done
    echo $(($r%max))
done | sort | uniq -c | sort -n

পরীক্ষার ফলাফল:

  16425 5
  16515 1
  16720 0
  16769 2
  16776 4
  16795 3

বিকল্পটি আলাদা একটি এলোমেলো উত্স ব্যবহার করবে যার মধ্যে লক্ষণীয় পক্ষপাত নেই (কেবলমাত্র 32768 সম্ভাব্য মানের চেয়ে বৃহত্তরের অর্ডার)। তবে যাইহোক, পুনরায়-রোল যুক্তি প্রয়োগ করা ক্ষতিগ্রস্থ হয় না (এমনকি এটি সম্ভবত কখনই কার্যকর হয় না)।


আপনার উত্তরটি মূলত সঠিক, ব্যতীত: "$ RANDOM 32768% 6 এর চেয়ে কম হলে" আপনাকে পুনরায় রোল করতে হবে "আসলে" তল থেকে সমান বা তার বেশি হওয়া উচিত ((RANDMAX + 1) / 6) * 6 "(অর্থাৎ 32766 ), এবং এর নীচে সম্পর্কিত শেল কোডটি ঠিক করুন।
নায়ুকি

@ নায়ুকি যদি আপনি একটি নির্দিষ্ট ত্রুটি চিহ্নিত করতে পারেন (যা প্রদত্ত প্রসঙ্গে প্রযোজ্য) আমি এটি সংশোধন করতে পেরে খুশি হব। আমার সমাধানটি কেবল একটি উদাহরণ, এটি করার বিভিন্ন উপায় রয়েছে। আপনি শুরু পরিসীমা, বা শেষ পরিসীমা, বা মাঝখানে কোথাও থেকে পক্ষপাত সরিয়ে নিতে পারেন, এতে কোনও পার্থক্য নেই। আপনি এটিকে আরও ভাল করে গণনা করতে পারেন (এবং প্রতিটি পুনরাবৃত্তিতে কোনও মডুলো করবেন না)। আপনি বিশেষ ক্ষেত্রে যেমন স্বেচ্ছাসেবী মডুলোস এবং র্যান্ডম্যাক্স মানগুলি পরিচালনা করতে পারেন, এছাড়াও RANDMAX = INTMAX পরিচালনা করতে পারেন যেখানে RANDMAX + 1 বিদ্যমান নেই, তবে এখানে মনোনিবেশ করা হয়নি।
frostschutz

আপনার উত্তরটি আপনার পোস্টের চেয়ে উল্লেখযোগ্যভাবে খারাপ। প্রথমত, আমি নির্দিষ্ট করেছিলাম আপনার কোন বাক্যাংশটি সত্যই ভুল। মনে রাখবেন যে "32768% 6" == 2, তাই আপনি প্রতিবার roll RANDOM <2 টি পুনরায় তালিকাভুক্ত করতে চান? পরিসীমাটির শুরু / শেষ / মিডডে পক্ষপাত সম্পর্কে, আপনার পুরো পোস্টটি পরিসীমা শেষে পক্ষপাত অপসারণ করার বিষয়ে এবং আমার প্রতিক্রিয়াও ঠিক তা পূরণ করে। তৃতীয়ত, আপনি RANDMAX = INTMAX পরিচালনার বিষয়ে কথা বলছেন, কিন্তু আপনার উত্তরে আপনি 32768 (= 32767 + 1) মান উল্লেখ করেছেন বহুবার, যা বোঝায় যে আপনি RANDMAX + 1 গণনা করতে স্বাচ্ছন্দ্যবোধ করছেন।
নায়ুকি

1
@ নয়ুকি আমার কোডটি 0 এবং 1 সরিয়ে দেয়, আপনার 32766 এবং 32767 সরিয়ে দেয় এবং আমি আপনাকে বিশদভাবে জানাতে চাই: এতে কী তফাত হবে? আমি কেবল মানুষ, আমি ভুল করি, তবে আপনি এতক্ষণ যা বলেছিলেন তা "এটি ভুল" কারণ ব্যাখ্যা না করে বা না দেখিয়েই। ধন্যবাদ.
frostschutz

1
কিছু মনে করবেন না, এটি নির্ধারণ। মিথ্যা অ্যালার্ম সম্পর্কে দুঃখিত।
নায়ুকি

23

এটি মডুলো পক্ষপাতিত্ব। যদি RANDOMভালভাবে নির্মিত হয়, 0 এবং 32767 এর মধ্যে প্রতিটি মান সমান সম্ভাবনার সাথে উত্পাদিত হয়। আপনি যখন মডুলো ব্যবহার করেন, আপনি সম্ভাবনাগুলি পরিবর্তন করেন: মডুলোর উপরে থাকা সমস্ত মানগুলির সম্ভাব্যতা তাদের মানচিত্রের মানগুলিতে যুক্ত হয়।

আপনার উদাহরণে, 6 × 3600 মানের পরিসরের প্রায় দুই তৃতীয়াংশ। শীর্ষ তৃতীয়টির সম্ভাব্যতাগুলি নীচের তৃতীয়টির সাথে যুক্ত করা হয়েছে যার অর্থ 0 থেকে 2 (প্রায়) থেকে 3 থেকে 5 পর্যন্ত মান হিসাবে উত্পাদিত হওয়ার দ্বিগুণ হয় 9 9 × 3600 প্রায় 32767, তাই মডুলো পক্ষপাত অনেক ছোট এবং কেবল 32400 থেকে 32767 পর্যন্ত মানগুলিকে প্রভাবিত করে।

আপনার মূল প্রশ্নের উত্তর দিতে, কমপক্ষে বাশ এলোমেলো ক্রমটি সম্পূর্ণরূপে অনুমানযোগ্য যদি আপনি বীজ জানেন। দেখুন intrand32মধ্যে variables.c

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