আমি একটি দরজা পুরষ্কার জেতার সুযোগ কি?


12

আমার স্থানীয় এসিএম অধ্যায় সভাগুলিতে আগত লোকদের দ্বারস্থ পুরষ্কার দেয়। আপনি যদি প্রোগ্রামিং ধাঁধাটি সমাধান করেন তবে আপনি জয়ের আরও বর্ধিত সুযোগ পাবেন (তবে আমি সর্বদা সেই ধাঁধাটি সমাধান করি)। এইভাবে, কিছু লোকের 1 টি প্রবেশ রয়েছে, আবার অন্যদের 2 রয়েছে But তবে অপেক্ষা করুন! রাফেল প্রোগ্রামটি যেভাবে কাজ করে তা অন্য ধাঁধাটি সমাধান করার সময় অন্য এন্ট্রি যুক্ত করে নয়। পরিবর্তে, এটি কোনও ব্যক্তির "জীবন" সংখ্যাটি ট্র্যাক করে রাখে, হ্রাস করে যে যদি সেই ব্যক্তিকে প্রতিটি পাসে এলোমেলো নমুনা অ্যালগরিদম বেছে নেওয়া হয়। সুতরাং এটি এর মতো কাজ করে:

Doorknob: 1.  xnor: 2.  Justin: 2.  Alex: 1.  Dennis: 2.

তারপরে প্রোগ্রামটি এলোমেলোভাবে একটি বেছে নেয় [Doorknob, xnor, Justin, Alex, Dennis], সংখ্যা হ্রাস করে (বলুন এটি চয়ন করুন Justin):

Doorknob: 1.  xnor: 2.  Justin: 1.  Alex: 1. Dennis: 2.

এবং পুনরাবৃত্তি। যদি কারও "জীবন" এর সংখ্যা যায় 0(আসুন Justinআবার চয়ন করুন ), সেগুলি তালিকা থেকে সরানো হবে:

Doorknob: 1.  xnor: 2.  Alex: 1.  Dennis: 2.

এটি অব্যাহত থাকে যতক্ষণ না একজন ব্যক্তি রয়ে যায়; যে ব্যক্তি বিজয়ী হয়।

এখন আসল প্রশ্নটি হ'ল, আমি কীভাবে জিতে যেতাম সম্ভাবনা?


আপনাকে দুটি ইনপুট দেওয়া হবে:

  • n। এটি চ্যালেঞ্জে প্রবেশ করা লোকের সংখ্যা
  • k। এটি এমন লোকের সংখ্যা (যাদের মধ্যে n) 2 জন জীবন রয়েছে। এই সংখ্যাটি সর্বদা আপনাকে অন্তর্ভুক্ত করে।

সুতরাং আমার যদি কোনও ফাংশন থাকে pএবং ডেকে আনা হয় p(10, 5)তবে পুরষ্কার জয়ের সম্ভাবনা এটিই হবে যেখানে সেখানে 10 জন লোক রয়েছেন যার মধ্যে 5 টির মধ্যে কেবল 1 জন জীবন রয়েছে, যেখানে 5 (আপনার সহ) 2 জন জীবন পান।


আপনি জিতে যাওয়ার সম্ভাবনাটি হুবহু দশমিক হিসাবে আউটপুট করে প্রত্যাশিত। যে কোনও হারে, উত্তরগুলি অবশ্যই দশমিক পয়েন্টের পরে 4 দশমিক স্থান সহ সঠিক হতে হবে । আপনি কি সেই অঙ্কটি গোল করেন না তা আপনার উপর নির্ভর করে।

আপনার সমাধানটি এলোমেলোভাবে সমাধান হতে পারে যা উচ্চ সম্ভাবনার সাথে 4 র্থ দশমিক স্থানে উত্তর দেয় । আপনি ধরে নিতে পারেন যে আপনি যে আরএনজি ব্যবহার করেছেন তা সত্যই এলোমেলো এবং এর জন্য কমপক্ষে 90% সম্ভাব্যতা সহ সঠিক উত্তরটি আউটপুট করতে হবে।

তদ্ব্যতীত, আপনার n, k <= 1000কোডটির জন্য কেবলমাত্র কাজ করা দরকার , যদিও আমি আগ্রহীদের জন্য এর চেয়ে বড় পরীক্ষার কেস সরবরাহ করেছিলাম।


পরীক্ষার কেস

দ্রষ্টব্য: এর কয়েকটি সাধারণ সূত্র।

n,    k   |  output
----------+---------
1,    1   |  1
2,    2   |  0.5
2,    1   |  0.75
3,    1   |  11/18 = 0.611111111
1000, 1   |  0.007485470860550352
4,    3   |  0.3052662037037037
k,    k   |  1/k
n,    1   |  (EulerGamma + PolyGamma[1 + n])/n    (* Mathematica code *)
          |  (γ + ψ(1 + n))/n
10,   6   |  0.14424629234373537
300,  100 |  0.007871966408910648
500,  200 |  0.004218184180294532
1000, 500 |  0.0018008560286627948
---------------------------------- Extra (not needed to be a valid answer)
5000, 601 |  0.0009518052922680399
5000, 901 |  0.0007632938197806958

আরও কয়েকটি চেকের জন্য, p(n, 1) * nনিম্নলিখিত হিসাবে নিন:

n     |  output
------+---------
1     | 1
2     | 1.5 
3     | 1.8333333333333335
10    | 2.928968253968254
100   | 5.1873775176396215
-------------------------- Extra (not needed to be a valid answer)
100000| 12.090146129863305

আমি এই সাইটে ট্যাগগুলির সাথে আর পরিচিত নই; আপনি যদি আরও উপযুক্ত ট্যাগ মনে করেন, তবে সম্পাদনা করুন!
জাস্টিন

গণিত সম্পর্কিত ঘনিষ্ঠভাবে সম্পর্কিত প্রশ্ন: math.stackexchange.com/q/1669715/72616
জাস্টিন

সুতরাং, পি (এন, কে) = ((কে -1) / এন) পি (এন, কে -1) + ((এনকে) / এন) পি (এন -1, কে) + (1 / এন) প্রশ্ন ( এন, কে -1), যেখানে প্রশ্ন (এন, কে) = ((এনকে -1) / এন) প্রশ্ন (এন -1, কে) + (কে / এন) প্রশ্ন (এন, কে -1) এবং প্রশ্ন (1) , 0) = 1 ...
ফাঁসী নুন

@ কেনিলাউ আমি এটি ব্যাখ্যা করার চেষ্টা করতে যাচ্ছি না, তবে গণিতের এই লিঙ্কটি থেকে সাবধান থাকি, কারণ এটি ফাংশনটির কিছুটা আলাদা সংজ্ঞা ব্যবহার করে (আমি বিশ্বাস করি kএক দ্বারা বন্ধ হয়ে গেছে)
জাস্টিন

2
অবশ্যই পর্যাপ্ত পরীক্ষার সাথে একটি এলোমেলোভাবে সিমুলেশন করা ঠিক আছে যে উচ্চতর সম্ভাবনার সাথে উত্তরটি চতুর্থ দশমিক স্থানে সঠিক, যদিও অবশ্যই নিশ্চিত নয়?
xnor

উত্তর:


2

এমএটিএল , 42 বাইট

:<~QXJx`J`tf1Zry0*1b(-tzq]f1=vts3e8<]6L)Ym

এটি একটি সম্ভাব্য (মন্টি কার্লো) পদ্ধতির ব্যবহার করে। পরীক্ষাটি প্রচুর পরিমাণে চালিত হয়, যার থেকে সম্ভাবনাটি অনুমান করা হয়। সম্ভাব্যতা কমপক্ষে 90% সহ চতুর্থ দশমিক পর্যন্ত ফলাফল সঠিক কিনা তা নিশ্চিত করার জন্য উপলব্ধির সংখ্যা নির্বাচন করা হয়েছে selected তবে এটি খুব দীর্ঘ সময় এবং অনেক স্মৃতি লাগে takes নীচের লিঙ্কে উপলব্ধির সংখ্যা 10 6 এর একটি ফ্যাক্টর দ্বারা হ্রাস পেয়েছে যাতে প্রোগ্রামটি একটি যুক্তিসঙ্গত সময়ের মধ্যে শেষ হয়; এবং শুধুমাত্র প্রথম দশমিক কমপক্ষে 90% সম্ভাব্যতার সাথে নির্ভুল হওয়ার গ্যারান্টিযুক্ত।

সম্পাদনা (জুলাই 29, 2016): ভাষা পরিবর্তনের কারণে, এটি 6Lদ্বারা প্রতিস্থাপন করা দরকার 3L। নীচের লিঙ্কটিতে সেই পরিবর্তনটি অন্তর্ভুক্ত করা হয়েছে।

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

পটভূমি

যাক পি বোঝাতে সম্ভাব্যতা গণনা করা হয়। পরীক্ষা চ্যালেঞ্জ বর্ণিত একটি সংখ্যা জন্য চলবে এন সময়ের। প্রতিবার, হয় আপনি পুরস্কার জিতে (" সাফল্য ") অথবা আপনি না। যাক এন সাফল্যের সংখ্যা হতে। পছন্দসই সম্ভাবনাটি এন এবং এন থেকে অনুমান করা যায় । বৃহত্তর এন , অনুমানটি আরও সঠিক হবে। মূল প্রশ্নটি হ'ল কীভাবে পছন্দসই নির্ভুলতা পূরণের জন্য এন নির্বাচন করবেন , তা নিশ্চিত করে বলা যায় যে কমপক্ষে 90% বার ত্রুটি 10 −4 এর চেয়ে কম হবে ।

মন্টে কার্লো পদ্ধতি হতে পারে

  • স্থির-আকার : n এর একটি মান আগেই স্থির হয় (এবং তারপরে এন এলোমেলো হয়);
  • পরিবর্তনশীল-আকার : এন সিমুলেশন ফলাফল দ্বারা ফ্লাইতে নির্ধারিত হয়।

দ্বিতীয় বিভাগ মধ্যে একটি সাধারণ পদ্ধতি ব্যবহার ঠিক হয় এন (সাফল্যের আকাঙ্ক্ষিত সংখ্যা) এবং যতক্ষণ না সাফল্যের যে সংখ্যা অর্জিত হয় simulating রাখা । সুতরাং এন এলোমেলো। এই কৌশলটি, ইনভার্স বাইনোমিয়াল স্যাম্পলিং বা নেতিবাচক-দ্বিপদী মন্টে কার্লো নামে পরিচিত , এর সুবিধাটি রয়েছে যে অনুমানকারকের যথার্থতাটি সীমাবদ্ধ হতে পারে। এই কারণে এটি এখানে ব্যবহৃত হবে।

বিশেষ করে, নেতিবাচক-দ্বিপদ মন্টে কার্লো সঙ্গে এক্স = ( এন -1) / ( এন -1) একজন নিরপেক্ষ মূল্নির্ধারক হয় পি ; এবং প্রদত্ত অনুপাতের চেয়ে বেশি x দ্বারা পি থেকে বিভ্রান্ত হওয়ার সম্ভাবনাটি উপরের দিকে আবদ্ধ হতে পারে। এই কাগজটির সমীকরণ (1) অনুসারে ( শর্তগুলিও (2) সন্তুষ্ট কিনা তা নোট করুন), এন = 2.75 · 10 8 বা তার চেয়ে বড় গ্রহণ নিশ্চিত করে যে পি / এক্স অন্তত 90% সহ অন্তর [1.0001, 0.9999] এর অন্তর্গত সম্ভাবনা. বিশেষত, এর দ্বারা বোঝা যায় যে x যথাযথভাবে কমপক্ষে 90% সম্ভাব্যতা সহ 4 র্থ দশমিক স্থানে সঠিক।

কোড ব্যাখ্যা করা হয়েছে

কোডটি একটি বাইট সংরক্ষণ করতে N = ব্যবহার করে 3e8। নোট করুন যে এটি অনেকগুলি সিমুলেশন করতে দীর্ঘ সময় নিতে পারে। লিঙ্কটির কোডটি এন = ব্যবহার করে 300, যা বেশি যুক্তিসঙ্গত সময়ে চলে (প্রথম পরীক্ষার ক্ষেত্রে অনলাইন সংকলনে 1 মিনিটেরও কম); তবে এটি কেবল আশ্বাস দেয় যে কমপক্ষে 90% সম্ভাব্যতার সাথে প্রথম দশমিকটি সঠিক।

:        % Take k implicitly. Range [1 ... k]
<~       % Take n implicitly. Determine if each element in the previous array is
         % less than or equal than n
Q        % Add 1. This gives an array [2 ... 2 1 ... 1]
XJx      % Copy to clipboard J. Delete from stack
`        % Do...while. Each iteration is a Monte Carlo realization, until the 
         % desired nunber of successes is reached
  J      %   Push previously computed array [2 ... 2 1 ... 1]
  `      %   Do...while. Each iteration picks one door and decrements it, until
         %   there is only one
    t    %     Duplicate
    f    %     Indices of non-zero elements of array
    1Zr  %     Choose one of them randomly with uniform distribution
    y0*  %     Copy of array with all values set to 0
    1b(  %     Assign 1 to chosen index
    -    %     Subtract
    tzq  %     Duplicate. Number of nonzero elements minus 1. This is falsy if
         %     there was only one nonzero value; in this case the loop is exited
  ]      %   End do...while
  f1=    %   Index of chosen door. True if it was 1 (success), 0 otherwise
  v      %   Concatenate vertically to results from previous realizations
  ts3e8< %   Duplicate. Is the sum less than 3e8? If so, the loop is exited
]        % End do...while
6L)      % Remove last value (which is always 1)
Ym       % Compute mean. This gives (N-1)/(n-1). Implicitly display

হাহা আমি বুঝতে পারি নি যে 90% এটি কঠিন করে ফেলবে :-)
জাস্টিন

হ্যাঁ, 90% আত্মবিশ্বাসের সাথে চতুর্থ
দশমিকটি

2

পাইথ, 34 বাইট

Mc|!*HJ-GHch*J+*tHgGtH*gtGHKh-GHKG

পরীক্ষা স্যুট

আর্গুমেন্ট হিসাবে এন , কেg গ্রহণ করে একটি ডিস্ট্রিমেন্টিক মেমোয়াইজড রিকার্সিভ ফাংশন সংজ্ঞায়িত করে । প্রায় 18 সেকেন্ডের মধ্যে ফিরে আসে (উপরোক্ত টেস্ট স্যুটে অন্তর্ভুক্ত নয় কারণ এটি অনলাইন দোভাষী থেকে সময় বের করে)।g 1000 5000.0018008560286627952

আনুমানিক পাইথন 3 অনুবাদ হবে

@memoized
def g(n,k):
    return (not k*(n-k) or (1+(n-k)*((k-1)*g(n,k-1)+g(n-1,k)*(n-k+1)))/(n-k+1))/n

1

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

f=(n,k,d=n-k)=>(!d||(f(n-1,k)*++d*--d+1+(--k&&f(n,k)*k*d))/++d)/n

যদিও এটি বড় সংখ্যার সাথে চেষ্টা করবেন না; এমনকি চ (30, 10) একটি লক্ষণীয় পরিমাণ সময় নেয়।

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