জুয়াড়ির ফ্যালাসি ডাইস


26

জুয়াড়ির ত্রুটি একটি জ্ঞানীয় পক্ষপাত যেখানে আমরা ভুলভাবে ভবিষ্যতে ঘটে যাওয়া জিনিসগুলি সম্ভবত কম ঘটে এবং এমন জিনিসগুলি ঘটে যা খুব শীঘ্রই ঘটে যাওয়ার সম্ভাবনা বেশি থাকে বলে আশা করি। আপনার কাজ এটির একটি নির্দিষ্ট সংস্করণ বাস্তবায়ন করা।

চ্যালেঞ্জ ব্যাখ্যা

একটি ফাংশন লিখুন যা 1 এবং 6 এর মধ্যে একটি এলোমেলো পূর্ণসংখ্যা প্রদান করে। ধরা: প্রথম বার ফাংশনটি চালিত হওয়ার পরে, ফলাফলটি অভিন্ন হওয়া উচিত (1% এর মধ্যে), তবে পরবর্তী প্রতিটি কল মানগুলির পক্ষে কমিয়ে দেওয়া হবে যা পূর্বে কমবার রোল করা হয়েছে। নির্দিষ্ট বিশদটি নিম্নরূপ:

  • ডাই এ পর্যন্ত উত্পন্ন সংখ্যা গণনার স্মরণ রাখে।
  • প্রতিটি ফলাফল নীচের সূত্রের সাথে ওজনযুক্ত:countmaxcountdie+1
    • উদাহরণস্বরূপ, যদি এখনও অবধি রোল গণনা করা হয় , ওজন হবে , তার মানে আপনাকে হবে 4 গুণ বেশি একটি রোল সম্ভাবনা তুলনায় ।[1,0,3,2,1,0][3,4,1,2,3,4]23
    • নোট করুন যে সূত্রটির অর্থ হল রোল ফলাফলটি এর সমান ওজনযুক্ত[a,b,c,d,e,f][a+n,b+n,c+n,d+n,e+n,f+n]

বিধি এবং অনুমান

  • স্ট্যান্ডার্ড আই / ও বিধি এবং নিষিদ্ধ লুফোলস প্রযোজ্য
  • ডাই রোলগুলি নির্বিচারক হওয়া উচিত নয়। (অর্থাত্ একটি অস্থির উত্স থেকে বর্ধিত PRNG ব্যবহার করুন, সাধারণত বিল্টিন হিসাবে উপলব্ধ available)
  • আপনার এলোমেলো উত্স অবশ্যই কমপক্ষে 65535 পিরিয়ড হতে হবে বা সত্য এলোমেলো হওয়া উচিত।
  • 255 অবধি ওজনের জন্য বন্টনগুলি 1% এর মধ্যে থাকতে হবে
    • 16-বিট আরএনজি উপরের উভয় প্রয়োজনীয়তা মেটাতে যথেষ্ট ভাল। সর্বাধিক অন্তর্নির্মিত আরএনজি যথেষ্ট।
  • আপনি বর্তমান বিতরণ যতক্ষণ না পেরে যেতে পারেন যতক্ষণ না সেই বিতরণ হয় কল দ্বারা রূপান্তরিত হয় বা পোস্ট-রোল বিতরণ ডাই রোলের পাশাপাশি ফিরে আসে। বিতরণ / গণনা আপডেট করা এই চ্যালেঞ্জের একটি অংশ
  • আপনি গণনার পরিবর্তে ওজন ব্যবহার করতে পারেন। এটি করার সময়, যখনই কোনও ওজন 0 এ নেমে যায়, স্টোরিং গণনা হিসাবে একই প্রভাব অর্জন করতে সমস্ত ওজন 1 টি বৃদ্ধি করা উচিত।
    • আপনি এই ওজনগুলিকে অ্যারের উপাদানগুলির পুনরাবৃত্তি হিসাবে ব্যবহার করতে পারেন।

শুভকামনা। বাইটস আপনার পক্ষে সর্বদা থাকুক।


এটি প্রদর্শিত হয় আপনি এলোমেলো সংখ্যা এন দিয়ে শুরু করে, তারপরে আউটপুটিং (এন ++% 6) দ্বারা সমস্ত নিয়ম এবং নিষিদ্ধ লুফোলগুলি মেনে চলতে পারেন।
ফ্যাক্স

2
@ ফ্যাক্স এই সমস্যাটি স্পষ্টভাবে এবং ঠিক কীভাবে $ কে $ তম সংখ্যার বিতরণকে প্রথম $ কে -১ $ নম্বর দেওয়া উচিত তা নির্দিষ্ট করে Y আপনার ধারণাটি স্পষ্টতই প্রথম সংখ্যাটি প্রদত্ত দ্বিতীয় সংখ্যার জন্য ভুল বিতরণ দেয়।
জাইক

@ জাইক আমি দ্বিমত পোষণ করছি, কারণ যুক্তিটি অন্য যে কোনও কোডের সাথে ব্যবহার করা যেতে পারে যা সত্য র্যান্ডমের বিপরীতে পিআরএনজি ব্যবহার করে। আমার প্রস্তাব হল একটি PRNG, একটি খুব সরল এক যদ্যপি।
ফ্যাক্স

@ জিক মনে করছেন আপনি তাত্ত্বিক বিতরণের কথা বলছেন, তা। পরিসংখ্যানগত তাত্পর্য রাখতে যথেষ্ট পরিমাণে $ কে $ এর জন্য পরিমাপ করা বিতরণ প্রয়োজনীয় 1% এর মধ্যে।
ফ্যাক্স

1
@ ফ্যাক্স আপনার এলোমেলো উত্সটির কমপক্ষে 65535 পিরিয়ড নেই, সুতরাং এটি এই সমস্যার জন্য যথেষ্ট কোনও পিআরএনজি নয়। এছাড়াও "মাপা ডিস্ট্রিবিউশন" বলতে কী বোঝাতে চেয়েছি তাও আমি বুঝতে পারি না।
জিকে

উত্তর:


12

আর , 59 বাইট

function(){T[o]<<-T[o<-sample(6,1,,max(T)-T+1)]+1
o}
T=!1:6

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

গণনাগুলিতে রাখে T, যা তত্ক্ষণাত weightsযুক্তি হিসাবে ব্যবহারের জন্য রূপান্তরিত হয় sample(যা সম্ভবত তাদের যোগফলকে স্বাভাবিক করে তোলে 1)।

[<<-অপারেটর একটি মান নির্ধারণ করতে ব্যবহৃত হয় Tপিতা বা মাতা পরিবেশের (এই ক্ষেত্রে, শুধুমাত্র পিতা বা মাতা পরিবেশ এক .GlobalEnv)।


2
গ্লোবাল অ্যাসাইনমেন্টের দুর্দান্ত ব্যবহার। কোনও কারণ আপনি আপনার পরিবর্তনশীল বলেছেন T? (কোডটি পড়া আরও কঠিন করা ছাড়াও!)
রবিন রাইডার

@ রবিনরাইডার আমার মনে হয় যে আমার আসল ধারণাটি ফাংশনে ব্যবহার করা Tবা Fঅভ্যন্তরীণভাবে ছিল এবং তারপরে আমি বিশ্বব্যাপী অ্যাসাইনমেন্টের প্রয়োজনের বিষয়টি বুঝতে পেরে আমি এটি পরিবর্তন করতে খুব অলস হয়েছি was
জিউসেপ

3
@ রবিনরাইডার: আমি অবাক হয়েছি আপনি কোন ওয়াং-ল্যান্ডউ সমাধানের
শি'আন

1
@ শি'য়ান আমি একটিতে কাজ শুরু করেছি! প্যাকেজ ব্যবহার করার সময় বাইট গণনাটি খুব বেশি ছিল pawl
রবিন রাইডার

6

পাইথন 3 , 112 99 বাইট

from random import*
def f(C=[0]*6):c=choices(range(6),[1-a+max(C)for a in C])[0];C[c]+=1;print(c+1)

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

ব্যাখ্যা

# we only need the "choice" function
from random import*

      # C, the array that holds previous choices, is created once when the function is defined
      # and is persisted afterwards unless the function is called with a replacement (i.e. f(C=[0,1,2,3,4,5]) instead of f() )
      C=[0]*6
# named function
def f(.......):
                  # generate weights
                  [1-a+max(C)for a in C]
# take the first item generated using built-in method
c=choices(range(6),......................)[0]
    # increment the counter for this choice
    C[c]+=1
    # since the array is 0-indexed, increase the number by 1 for printing
    print(c+1)

সম্পাদনা করুন: 13 বাইট সংরক্ষিত ধন্যবাদ, অ্যাটিন্যাট !



@্যাটিনাত আপনি টিপল আনপ্যাকিং ( c,=এবং ড্রপ [0]) ব্যবহার করে 2 বাইট ড্রপ করতে পারেন । এছাড়াও লক্ষণীয় যে choicesপাইথন 3.6+
409_ কনফ্লিক্ট

5

05 এ বি 1 ই , 13 বাইট

Z>αāDrÅΓΩ=Q+=

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

ইনপুট হিসাবে গণনাগুলির তালিকা নেয়। রোলটি এবং নতুন গণনাগুলি আউটপুট করে।

ব্যাখ্যা:

Z                 # maximum
 >                # plus 1
  α               # absolute difference (vectorizes)
                  # the stack now has the list of weights
ā                 # range(1, length(top of stack)), in this case [1..6]
 D                # duplicate
  r               # reverse the entire stack
   ÅΓ             # run-length decode, using the weights as the run lengths
     Ω            # pick a random element
                  # the stack is now: counts, [1..6], random roll
=                 # output the roll without popping
 Q                # test for equality, vectorizing
  +               # add to the counts
   =              # output the new counts

3

জাভাস্ক্রিপ্ট (ES8), 111 বাইট

_=>++C[C.map((v,i)=>s+=''.padEnd(Math.max(...C)-v+1,i),s=''),n=s[Math.random()*s.length|0]]&&++n;[,...C]=1e6+''

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

কিভাবে?

এটি একটি বরং নিষ্পাপ এবং সম্ভবত suboptimal বাস্তবায়ন যা বর্ণিত হিসাবে অনুকরণটি সম্পাদন করে।

আমরা গণনাগুলি ট্র্যাক করি । প্রতিটি রোল এ, আমরা একটি স্ট্রিং বিল্ড প্রতিটি ডাই গঠিত পুনরাবৃত্তি কাল ও একটি অভিন্ন ডিস্ট্রিবিউশনের সাথে সেখানে একটি র্যান্ডম এন্ট্রি বাছাই।Csimax(C)Ci+1


3

এপিএল (ডায়ালগ ইউনিকোড) , 32 বাইট এসবিসিএস

বিরতি সূচক পরিবর্তে প্রতিলিপি ব্যবহার করে -4 বাইট।

{1∘+@(⎕←(?∘≢⌷⊢)(1+⍵-⍨⌈/⍵)/⍳6)⊢⍵}

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

একটি ফাংশন হিসাবে সংজ্ঞায়িত করা হয় যা বর্তমান বিতরণটিকে আর্গুমেন্ট হিসাবে গ্রহণ করে, ফলাফল ডাই রোলটি মুদ্রণ করে এবং আপডেট বিতরণটি প্রদান করে। টিআইওতে প্রথম রানটি 100 টি আমন্ত্রণ থেকে শুরু হয় [0,0,0,0,0,0], দ্বিতীয় রানটি 1 টির সাথে ভারী পক্ষপাতদুষ্ট হয় [0,100,100,100,100,100]এবং শেষ রানটি একই পদ্ধতিতে 6 এর দিকে ভারী পক্ষপাতদুষ্ট থাকে।


3

পার্ল 6 , 31 বাইট

{--.{$/=.pick}||++«.{1..6};$/}

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

সমস্ত ওজন যেখানে রয়েছে তার সাথে শুরু করে বর্তমান ওজন বিতরণকে ব্যাগহ্যাশ হিসাবে গ্রহণ করে The বিতরণটি জায়গায় জায়গায় রূপান্তরিত হয়।

ব্যাগহ্যাশ pickপদ্ধতি সম্পর্কিত ওজন ব্যবহার করে এলোমেলোভাবে একটি কী নির্বাচন করে; সেই কীটির ওজন একের পরে কমে যায়। যদি সেই ওজন যদি শূন্য হয়, ++«.{1..6}তবে সমস্ত সংখ্যার ওজন বাড়িয়ে দেয় 1-6।



2

জাভাস্ক্রিপ্ট (ES6 +), 97 বাইট

d=[1,2,3,4,5,6]
w=[...d]
r=x=>(i=~~(Math.random()*w.length),k=w[i],w.concat(d.filter(x=>x!=k)),k)

ব্যাখ্যা

d=[1,2,3,4,5,6]                   // basic die
w=[...d]                          // weighted die
r=x=>(                            // x is meaningless, just saves 1 byte vs ()
  i=~~(Math.random()*w.length),   // pick a random face of w
  k=w[i],                         // get the value of that face
  w.concat(d.filter(x=>x!=k)),    // add the faces of the basic die that aren't the value
                                  // we just picked to the weighted die
  k                               // return the value we picked
)

নোট করুন, এটি 32 -1 এর wদৈর্ঘ্য অতিক্রম করলে অবশেষে এটি ফুরিয়ে যাবে, যা জেএসের সর্বাধিক অ্যারে দৈর্ঘ্য, তবে আপনি সম্ভবত এর আগে একটি স্মৃতি সীমাতে আঘাত হানবেন, 32-বিট ইন্ট অ্যারে 2 32 -1 দীর্ঘ বিবেচনা করে 16 জিবিবি এবং কিছু (বেশিরভাগ?) ব্রাউজার আপনাকে 4GiB এর বেশি ব্যবহার করতে দেয় না।


2

পার্ল 6 , 49 বাইট

{($!=roll (1..6 X=>1+max 0,|.{*})∖$_:),$_$!}

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

পূর্ববর্তী রোলগুলি একটি ব্যাগ (মাল্টিসেট) হিসাবে নেয়। নতুন রোল এবং নতুন বিতরণ প্রদান করে।

ব্যাখ্যা

{                                            }  # Anon block taking
                                                # distribution in $_
                     max 0,|.{*}  # Maximum count
                   1+             # plus one
           1..6 X=>  # Pair with numbers 1-6
          (                     )∖$_  # Baggy subtract previous counts
     roll                            :  # Pick random element from Bag
 ($!=                                 )  # Store in $! and return
                                       ,$_$!  # Return dist with new roll

1

পাইথ , 22 20 বাইট

Xt
hOs.e*]kh-eSQbQQ1

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

ইনপুট একটি তালিকা হিসাবে পূর্ববর্তী ফ্রিকোয়েন্সি, পরবর্তী রোল আউটপুট এবং একটি নতুন লাইন দ্বারা পৃথক আপডেট করা ফ্রিকোয়েন্সি।

Xt¶hOs.e*]kh-eSQbQQ1   Implicit: Q=eval(input())
                       Newline replaced with ¶
      .e         Q     Map elements of Q, as b with index k, using:
             eSQ         Max element of Q (end of sorted Q)
            -   b        Subtract b from the above
           h             Increment
        *]k              Repeat k the above number of times
                       Result of the above is nested weighted list
                       e.g. [1,0,3,2,1,0] -> [[0, 0, 0], [1, 1, 1, 1], [2], [3, 3], [4, 4, 4], [5, 5, 5, 5]]
     s                 Flatten
    O                  Choose random element
   h                   Increment
  ¶                    Output with newline
 t                     Decrement
X                 Q1   In Q, add 1 to the element with the above index
                       Implicit print

1

জেলি , 12 বাইট

’ạṀJx$X,Ṭ+¥¥

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

একটি মোনাডিক লিঙ্ক যা একটি একক যুক্তি, বর্তমান গণনা তালিকা গ্রহণ করে এবং নির্বাচিত সংখ্যার একটি তালিকা এবং আপডেট গণনা তালিকাকে দেয়।

জেলি , 18 বাইট

0x6+ɼṀ_®‘Jx$XṬ+ɼṛƊ

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

বিকল্প হিসাবে, এখানে একটি নীলাদিক লিঙ্ক যা নির্বাচিত নম্বরটি ফেরত দেয় এবং রেজিস্টারে গণনা তালিকাকে ট্র্যাক করে রাখে।

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