র্যান্ডম জেনারেটর পরিবর্তন করা থেকে ডাইস


10

ভূমিকা

নিম্নলিখিত প্রয়োগের সাথে আপনাকে একটি এলোমেলো পূর্ণসংখ্যার জেনারেটর দেওয়া হচ্ছে

  • প্রথম প্রার্থনা সর্বদা 1 প্রদান করে।
  • দ্বিতীয় অনুরোধটি 1 এবং 2 এর মধ্যে একটি এলোমেলো পূর্ণসংখ্যা প্রদান করে।
  • তৃতীয় প্রার্থনাটি 1 থেকে 3 এর মধ্যে একটি এলোমেলো পূর্ণসংখ্যা প্রদান করে।
  • নবম প্রার্থনাটি 1 এবং n এর মধ্যে একটি এলোমেলো পূর্ণসংখ্যা প্রদান করে lusive

উপরের ফাংশনের উপর ভিত্তি করে, একটি এলোমেলো ডাইস জেনারেটর লিখুন যা পুরোপুরি এলোমেলো, সমান সম্ভাবনা সহ 1 এবং 6 (সমেত) এর মধ্যে একটি মান ফিরিয়ে দেয়।

বিধি

  • আপনার প্রোগ্রাম / ফাংশনটির ফলাফল 1 এবং 6 এর মধ্যে একটি এলোমেলো পূর্ণসংখ্যার অন্তর্ভুক্ত হওয়া উচিত, কিছু ব্যবহারযোগ্য আকারে সমেত, যেমন স্ট্যান্ডার্ড আউটপুট বা ফাংশন রিটার্ন মান হিসাবে।
  • উপরে আরোহণের এলোমেলো সংখ্যা জেনারেটরটিকে আপনার প্রোগ্রামের একটি "ফ্রি" ফাংশন হিসাবে সংজ্ঞায়িত করা যেতে পারে (যেমন, আপনার চরিত্রের গণনা গণনা করা হয় না), বা একটি পৃথক স্ক্রিপ্ট / প্রোগ্রাম যা প্রয়োজন অনুসারে কার্যকর করা হয়, ধরে নিয়ে রাষ্ট্র ( n) স্থির থাকে কল মধ্যে।
  • ধরে নিন যে আপনার প্রোগ্রামের একক ব্যবহারের ক্ষেত্রে আর 1000 এর বেশি ডাইস রোলগুলির জন্য অনুরোধ করা হবে না, এবং প্রারম্ভিক 1ওভারফ্লো এড়াতে প্রাথমিক র্যান্ডম নম্বর জেনারেটর 1000 ডাইস রোলসের শেষে পুনরায় সেট করা যাবে n
  • উপরে বর্ণিত আরোহী র্যান্ডম জেনারেটর ব্যতীত আপনার প্রোগ্রামটি এলোমেলো সংখ্যার অন্য কোনও উত্স ব্যবহার করতে পারে না । আপনি অবশ্যই প্রতিটি একক ডাইস রোল আউটপুট জন্য এলোমেলো সংখ্যা জেনারেটর থেকে একাধিক র্যান্ডম সংখ্যার জন্য অনুরোধ করতে পারেন।
  • এটি কোড-গল্ফ, তাই বিজয়ী সংক্ষিপ্ত উত্তর বা টাইয়ের ক্ষেত্রে বেশিরভাগ ভোট। আপনি যদি 1000 টিরও কম রেন্ডম সংখ্যার ব্যবহার করে 1000 ডাইস রোলস তৈরি করতে পারেন তবে নিজেকে 10-পয়েন্ট দক্ষতার বোনাস দিন

উদাহরণ

./asc-rand
1 # random integer between 1 and 1
./asc-rand
1 # random integer between 1 and 2
./asc-rand
3 # random integer between 1 and 3
./asc-rand
4 # random integer between 1 and 4

# dice-gen generates random dice based on output of asc-rand program.
./dice-gen
3
./dice-gen
6
./dice-gen
5
./dice-gen
1

প্রোগ্রামটি কি iterate(6):b=asc-rand(); print bঅবৈধ বা এটি কার্যকর নয়? আমি তৃতীয় নিয়ম ভুল বুঝতে পারে।
beary605

@ beary605: এলোমেলো নম্বর জেনারেটর কেবল প্রতিটি ডাইস রোলের মধ্যে নয়, পুরো 1000 ডাইস রোলগুলির পরে পুনরায় সেট করা যাবে। আমি যে কারণটি উল্লেখ করেছি কেবলমাত্র এলোমেলো নম্বর জেনারেটর দ্বারা প্রদত্ত মূল্যের উপর সম্ভাব্য ওভারফ্লোগুলি নিয়ে কাজ করা এই চ্যালেঞ্জের অন্যতম উদ্বেগ নয়সম্পাদনা: আমি বিধিটির উদ্দেশ্যটি স্পষ্ট করে জানিয়েছি, আশা করি এটির সাহায্য হবে।
মেল্লামোকব

আপনি যখন "এলোমেলো সংখ্যা" বলছেন তখন আপনার অর্থ কি "এলোমেলো পূর্ণসংখ্যা" বা "এলোমেলো (সংক্ষিপ্ত) বাস্তব সংখ্যা"? সম্ভবত কিছু কনভেনশন আছে যা সম্পর্কে আমি অবগত নই।
ডেভিডসি

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

1
আমাদের কী এলোমেলো করে জিজ্ঞাসা করার অনুমতি দেওয়া হয়েছে যে এটি কতবার এলোমেলো সংখ্যা তৈরি করেছে? আমি এমন ছাপে ছিলাম যে আমরা পারিনি।
ম্যাট

উত্তর:


2

জে - 13 চর

এটি গল্ফস্ক্রিপ্টের মতো একই অনুমানগুলি করে: ডাইসের সংখ্যা স্টিডিনে রয়েছে এবং আমরা পাশা রোলগুলি তালিকাভুক্ত করব যা প্রকাশিত হবে।

r=:1+?  NB. free random function
r>:i.".1!:1]1

বিস্ফোরণ দ্বারা ব্যাখ্যা:

r=:1+?           NB. r(x) = 1 + a random number between 0 and n-1
           ]1    NB. input file handle
       1!:1      NB. read in a string
     ".          NB. convert to integer
 >:i.            NB. make a list of numbers, from 1 to that integer
r                NB. apply the random function

যদি তা কোনওভাবেই সন্তুষ্ট না হয় তবে এখানে একটি দীর্ঘ, ২১-চর প্রোগ্রাম রয়েছে, যা f''এলোমেলো সংখ্যার উত্পন্ন করার জন্য বলা যেতে পারে , একটি রাষ্ট্র এবং সমস্ত কিছু বৈশিষ্ট্যযুক্ত।

r=:1+?  NB. free random function
c=:0
f=:3 :'r c=:1+c'

কে অনুরূপ উদাহরণ: বিনামূল্যে রেণ্ডম ফাংশন r:{*1_draw x}, stdin সংস্করণ (10 গৃহস্থালির কাজ করা) r'1+!. 0:` , ফাংশন সংস্করণ (14 গৃহস্থালির কাজ করা) c:0;f:{r@c+:1}ডাকা f[]
অ্যালগরিদমশর্ক 3

6

পাইথন, ৩১ টি অক্ষর

একইভাবে স্ক্লাইভারে, জেনারেটরটির মতো এটি সংজ্ঞায়িত করুন:

from random import randint
n=0
def r():
    global n;n+=1
    return randint(1,n)

তারপরে ডাইস রোলগুলি ফিরিয়ে ফাংশন:

D=lambda:eval('r(),'*6)[-1]%6+1

D()আপনার অভিন্ন র্যান্ডম ডাইস রোলের যে কোনও সময় কল করুন।


আহ, চতুর চালাক ব্যবহার, আমি এটি পছন্দ করি।
স্কিওভার

3

স্কেলা 23

def s={r;r;r;r;r;r%6+1}

পদ্ধতিটি এর (প্রায়) প্রয়োগ করা যেতে পারে:

var cnt = 0 
val rnd = new util.Random 

def r = {
  cnt %= 1000
  cnt += 1
  rnd.nextInt (cnt)
}

মোটামুটি পরীক্ষা:

scala> (1 to 6).map (i => ((1 to 600) map (_=>s)).filter (_ == i).size)
res26: scala.collection.immutable.IndexedSeq[Int] = Vector(110, 105, 91, 96, 106, 102)

প্রতি 6th ষ্ঠ কলটিতে values ​​টি মানের সমান বন্টন করা উচিত, তাই আমি ৫ টি ফেলে দিই।


2

গল্ফস্ক্রিপ্ট (15 টি অক্ষর)

এটি ধরে নিয়েছে যে প্রয়োজনীয় রোলগুলির সংখ্যা স্টিডিনে সরবরাহ করা হয় এবং তালিকান যে স্ট্যান্ডআউটের অনেক ফলাফল।

# The free increasing random function
0:N;{N):N rand)}:r;

~{r{;r}5*6%)n}*

অনলাইন ডেমো

যদিও আমি ১০০ টিরও কম রোল ব্যবহার করে ১০০ সংখ্যা তৈরি করতে ১০ পয়েন্ট বোনাস পেতে পারি, এতে আমার জন্য 10 টিরও বেশি অক্ষর লাগবে। N 2 বা 3 পাওয়ারের একাধিক হলে উপযুক্ত এনট্রোপি উত্তোলনের তুচ্ছ দৃষ্টিভঙ্গি খুব কম হয়ে যায় কারণ উপলব্ধ 3 টি ফলাফলের সংখ্যা কেবল 333 + 111 + 37 + 12 + 4 + 1 = 498। তাই এটি প্রয়োজনীয় একটি নমুনা-এবং-প্রত্যাখ্যান পদ্ধতির গ্রহণ করুন। এই পদ্ধতির ব্যবহার করে আপনি 1000 কল থেকে প্রত্যাশিত 2242 রোল পেতে পারেন rতবে বইয়ের রক্ষণ থেকে অতিরিক্ত ওভারহেড রয়েছে এবং baseএটি একটি দীর্ঘ ফাংশনের নাম।


5
"এবং baseএটি একটি দীর্ঘ ক্রিয়াকলাপের নাম" আপনি সম্ভবত গাণিতিক ব্যবহার করেন না । আমরা যেমন বিস্ময়ের পেতে NegativeBinomialDistribution, ExponentialGeneratingFunction, MathieuCharacteristicExponent, InverseFourierSequenceTransform, এবং SemialgebraicComponentInstances। :-)
মিঃ উইজার্ড

1

পাইথন 65 63

i=7
while i>5:[R()for x in range(9)];i=int(`R()`[-1])
print i+1

ফাংশনটি R()আরোহী র্যান্ডমাইজার।

ব্যবহার:

$ ./rollDice.py
3
$ ./rollDice.py
5

কেন আপনার forলুপ থেকে মুক্তি পাবেন না এবং কেবল Rনিজের whileলুপের আগে একবার কল করবেন ?
কিথ র্যান্ডাল

@ কিথরানডাল আমার ডাইস রোল হিসাবে যে নম্বরটি আমি ফিরে আসছি তা হ'ল আরোহণের জেনারেটর যে সংখ্যায় ফিরে আসে তার শেষ সংখ্যা। সমস্ত সম্ভাব্য সংখ্যার জন্য সমান সম্ভাবনা নিশ্চিত করতে আমাকে আরোহণের জেনারেটরে 10 কল করা দরকার।
ম্যাট 11

10 টি কল কেন? নীতিগতভাবে, যদি জেনারেটরটি এলোমেলো হয়, তবে প্রতিটি কল কি দশ (দশ) সংখ্যার জন্য সমান সম্ভাবনা দেবে না? অবশ্যই, অনুশীলনে, আপনি কেবলমাত্র প্রতিটি সংখ্যার জন্য সমান সংখ্যার কাছে যেতে আশা করতে পারেন।
ডেভিডসি

@ ডেভিডকার্যাহার জেনারেটর 1 থেকে n পর্যন্ত এলোমেলো নম্বর দেয় যেখানে এন এটির নাম্বার সংখ্যা। আমি এই ফিরে আসা সংখ্যার শেষ সংখ্যাটি দেখছি। N যদি 10 এর পূর্ণসংখ্য একাধিক না হয় তবে সম্ভাবনাটি অভিন্ন হবে না। উদাহরণস্বরূপ: যদি এন = ১৩ সম্ভাব্যতা নীচের হিসাবে বিচ্ছিন্ন হয়ে যায়: রোল 1,5,6 এর জন্য 1/9 এবং রোল 2,3,4 এর জন্য 2/9
ম্যাট

@ ম্যাট: আমি ধরে নিয়েছিলাম যে R()একটি ফ্লোট ফেরত আসবে এবং আপনি সর্বনিম্ন-উল্লেখযোগ্য অঙ্কটি ধরছেন । এখন এটি পরিষ্কার হয়ে গেছে যে R()কোনও পূর্ণসংখ্যা ফেরত দেয়, এটি বোঝা যায়।
কীথ র্যান্ডাল 16

1

পাইথন, 56

r হিসাবে সংজ্ঞায়িত করা হয়:

from random import randint
n=0
def r(z):
    global n;n+=1
    return randint(1,n)

পাশা জেনারেটর ডি:

import math;d=lambda:math.ceil(6.*r(r(r(r(r(r(0))))))/n)

ব্যবহার, উদাহরণস্বরূপ, 100 রোলগুলির জন্য:

for i in range(100):print d()

আপনি সম্ভবত মুছে দিতে পারেন import mathযদি আপনি প্রতিস্থাপন math.ceil(...)সঙ্গেint(...)+1
ম্যাট

আমি করব, তবে এটি সম্ভাব্য আউটপুট হিসাবে 7 উত্পাদন করবে।
স্কিওভার

ও আচ্ছা. আমি সেটা মিস করেছি.
ম্যাট 16

মেল্লামোকব আরোহী র্যান্ডমাইজার সম্পর্কে আমার একটি প্রশ্ন পরিষ্কার করেছিলেন। আপনাকে এন এর জন্য জিজ্ঞাসা করার অনুমতি নেই।
ম্যাট 17

1

গণিত 51

এলোমেলো নম্বর জেনারেটর, rগ্লোবাল ভেরিয়েবল সেট করে n1 এ পুনরায় সেট করা হয় ।

n = 1; r[c_] := RandomInteger[{1, c}]

কোড

সংক্ষিপ্ততম কোডটির দৌড়ে নেই ...

h := (n++; If[n < 4 \[Or] (y = r@n) > 6 Quotient[n, 6], h, y~Mod~6 + 1])

ব্যবহার

t = Table[h, {60000}];
n
SortBy[Tally[t], First]

পাশের 60000 রোলগুলির জন্য 60031 কল করতে প্রয়োজনীয় hTally1-6 দ্বারা সংখ্যা ভাঙ্গা দেখায়।

60031

{{1, 9923}, {2, 9966}, {3, 10016}, {4, 10028}, {5, 10009}, {6, 10058}


1

পার্ল, 22 বা 45

আরোহী এলোমেলো সংখ্যা জেনারেটরের বাস্তবায়ন:

my $n=0;
sub r { $n++; return 1+int(rand$n); }

জেনারেট:

#copy of the Scala solution; short code; uses 6N rolls
sub s{r;r;r;r;r;1+r%6}
#more efficient implementation, uses approximately 6+N+lnN rolls
sub roll { do{$a=r-1}while($a>$n-$n%6);return 1+(1+$a)%6 }

পরীক্ষা করা:

n সংখ্যা chisquare
1 10001867 0.348569
2 10004853 2.355161
3 9994395 3.141602
4 10000177 0.003133
5 9999227 0.059753
6 9999481 0.026936
টি 60000000 5.935154
60000000 ডাইস রোলগুলি 60000042 কলগুলি r এবং 570.432735 সেকেন্ডে নিয়েছে



0

গল্ফস্ক্রিপ্ট , 8 বাইট

f;3f*f(-

এটি অনলাইন চেষ্টা করুন!

এটি একবার জেনারেটর পপ করে, তারপরে ফলাফল থেকে মুক্তি পায়। তারপরে এটি f2 ঘূর্ণায়মান হয় এবং এটি 3 (3 বা 6) দ্বারা গুণ করে, তারপরে f3-1 (0, 1, 2) বিয়োগ করে যার ফলাফল (3-2, 3-1, 3-0) বা (6-2, 6-1, 6-0) ডাব্লু 5।

এই প্রশ্নটি পোস্ট করার আগে গল্ফস্ক্রিপ্ট এবং এলোমেলো ফাংশন বিদ্যমান ছিল, সুতরাং এটি একটি আইনী জমা submission

এটি কেবলমাত্র একবারে জমা দেওয়া। যদি আপনাকে একটি কলটিতে কয়েকবার চালানোর দরকার হয়,

গল্ফস্ক্রিপ্ট , 12 বাইট

f;3f*f-)0:i;

এটি অনলাইন চেষ্টা করুন!

এটি আপনার i টি কল 0 তে পুনরায় সেট করে তাই এটি অনুসারে পুনরায় সেট হয়। এই টিআইও 50 টি এলোমেলো ফলাফল দেখায়।


0

সি (জিসিসি) , 31 বাইট

f(i){for(i=5;i--;)c;i=~-c%6+1;}

প্রতি 6 টি কল, উত্পাদিত সমেত 1 এবং 6 এর মধ্যে প্রতিটি সংখ্যার সম্ভাবনা সমান।

cহয় #defineএকটি ফাংশন যে নিখুঁত র্যান্ডম সংখ্যা উত্পন্ন একটি কল হিসাবে ঘ।

এটি অনলাইন চেষ্টা করুন!

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