ইনপুট হিসাবে একটি ন্যায্য মুদ্রা দেওয়া, কোনও নির্দিষ্ট অনুচিত ফলাফল উত্পন্ন


13

অন্যায্য মুদ্রা ব্যবহার করে ন্যায্য মুদ্রা উত্পন্ন করা সহজ তবে বিপরীতটি সম্পাদন করা আরও কঠিন।

আপনার প্রোগ্রামটি ইনপুট হিসাবে এক নম্বর এক্স (0 এবং 1 এর মধ্যে অন্তর্ভুক্ত) পাবে। ইনপুটটি সোর্স কোডের মাঝামাঝি কোনও সংখ্যা হিসাবে সহজেই কোডড হওয়া উচিত নয়। এরপরে অবশ্যই একটি একক অঙ্কটি ফিরিয়ে 1আনতে হবে: এক্স এর সম্ভাব্যতা এবং 0অন্যথায়।

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

আপনার প্রোগ্রামটিকে অন্য কোনও এলোমেলো সংখ্যা উত্পন্ন ফাংশন বা বাহ্যিক উত্স (যেমন সময় এবং তারিখ ফাংশন) যা এলোমেলো সংখ্যা উত্পন্নকরণ ফাংশন হিসাবে কাজ করতে পারে তা ব্যবহার করার অনুমতি নেই। এটি কোনও বাহ্যিক ফাইল অ্যাক্সেস করতে বা বাহ্যিক প্রোগ্রামগুলির সাথে কাজটি পাস করতে পারে না।

এটি কোড গল্ফ, সংক্ষিপ্ত উত্তর জেতে।


ইনপুট কোন রূপ নেয়? যদি আমরা গ্যারান্টিযুক্ত হয়ে থাকি যে এটি একটি নির্দিষ্ট আকারের একটি আইইইই -754 ভাসমান পয়েন্ট সংখ্যা, তবে এটি আসলে বেশ সহজ।
পিটার টেলর

উত্তর:


4

পার্ল, 37 42 চর

($d/=2)+=rand>.5for%!;print$d/2<pop|0

কমান্ড লাইন আর্গুমেন্ট হিসাবে নির্বিচারে সম্ভাবনা নেয়। এতে অভিন্ন র্যান্ডম সংখ্যা তৈরি করে $dএবং এটি ইনপুটটির সাথে তুলনা করে।

এর আগে, 52 চর সমাধান

$p=<>;do{$p*=2;$p-=($-=$p)}while$--(.5<rand);print$-

1
আমি অভিভূত হয়েছি যে আপনি 6 বছর পরে এই সমাধানটি অনুকূলিত করতে ফিরে এসেছেন।
মিশা লাভরভ

3

পাইথন, ৮১ টি চর

import random
print(sum(random.randint(0,1)*2**-i for i in range(9))<input()*2)+0

কিছুটা হলেও বন্ধ হতে পারে তবে 1% এর বেশি কখনও হবে না।


আমার কাছে 1% এর চেয়ে অনেক ভাল দেখাচ্ছে। আমি আপনার প্রোগ্রামটি [০.১] এর সম্ভাব্যতার জন্য ১০০,০০০ বার চালিয়েছি ০.০১ এর একটি পদক্ষেপ নিয়ে এবং random.random() < desiredProbabilityএই স্ক্রিপ্টটি ব্যবহার করে এর সাথে তুলনা করেছি : gist.github.com/3656877 তারা পুরোপুরি মেলে i.imgur.com/Hr8uE.png
ম্যাট

যদিও, প্রত্যাশিত হিসাবে, random.random() < xএটি যথেষ্ট দ্রুত।
ম্যাট

3

গণিত 165

প্রবাহিত নয়, তবে কিছু আগ্রহের অ্যালগরিদম খুঁজে পেতে পারে:

d = RealDigits; r = RandomInteger;
f@n_ := If[(c = Cases[Transpose@{a = Join[ConstantArray[0, Abs[d[n, 2][[2]]]], d[n, 2][[1]]], 
         RandomInteger[1, {Length@a}]}, {x_, x_}]) == {}, r, c[[1, 1]]]

ব্যবহার

f[.53]

1

চেক

আসুন দেখুন এখন সময়ের প্রায় 53% এর f[.53]মান উত্পাদন করে কিনা 1। প্রতিটি পরীক্ষা 10 ^ 4 এর নমুনার জন্য% গণনা করে।

এ জাতীয় 50 টি পরীক্ষা চালানো হয় এবং গড় হয়।

Table[Count[Table[f[.53], {10^4}], 1]/10^4 // N, {50}]
Mean[%]

{0.5292, 0.5256, 0.5307, 0.5266, 0.5245, 0.5212, 0.5316, 0.5345, 0.5297, 0.5334, 0.5306, 0.5288, 0.528, 0.5379, 0.5298, 0.5263, 0.539, 0.5322, 0.5195, 0.5208, 0.5382, 0.543, 0.5303, 0.5305 , 0.5297, 0.5318, 0.5243, 0.5281, 0.5361, 0.5349, 0.5308, 0.5265, 0.5309, 0.5233, 0.5345, 0.5316, 0.5376, 0.5264, 0.5269, 0.5295, 0.523, 0.5294, 0.5326, 0.5316, 0.5334, 0.5165, 0.5296, 0.5266 }

0.529798

ফলাফলের হিস্টোগ্রাম

বারলেখ

ব্যাখ্যা (স্পয়লার সতর্কতা!)

.53 এর বেস 2 উপস্থাপনা হ'ল

.10000111101011100001010001111010111000010100011110110

বাম থেকে ডানে অগ্রসর হওয়া, একবারে এক অঙ্ক:

যদি র্যান্ডমআইন্টিজার [] 1 প্রদান করে, তবে উত্তর = 1,

অন্যথায় যদি দ্বিতীয় র্যান্ডমইন্টিজার [] 0 দেয়, তবে উত্তর = 0,

অন্যথায় যদি তৃতীয় র্যান্ডমইন্টিজার [] 0 দেয়, উত্তর = 0,

অন্য ....

যদি, যখন সমস্ত অঙ্কগুলি পরীক্ষা করা হয়, এখনও কোনও উত্তর নেই, তবে উত্তর = র্যান্ডমইন্টিজার []।


1

হাস্কেল, ১০7 টি চরিত্র:

import System.Random
g p|p>1=print 1|p<0=print 0|1>0=randomIO>>=g.(p*2-).f
f x|x=1|1>0=0.0
main=readLn>>=g

0

ওল্ফ্রাম ভাষা (গণিত) , 42 বাইট

RandomInteger[]/.⌈1-2#⌉:>#0@Mod[2#,1]&

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

এটি একটি পুনরাবৃত্তি পদ্ধতির approach অগল্ফড, অ্যালগরিদমটি হ'ল:

  • যদি ইনপুট সম্ভাবনাটি p1/2 এর কম হয়, তবে যখন কয়েনপ্লিপ 0 এ আসে, ফিরে আসুন 0 0 অন্যথায়, পুনরাবৃত্তি করুন 2p; যথার্থতা ধরে নিলে, 1 পাওয়ার সামগ্রিক সম্ভাবনা অর্ধেক 2pবা তার অর্ধেক p
  • যদি ইনপুট সম্ভাবনাটি p1/2 এর বেশি হয়, তবে যখন কয়েনপ্লিপটি 1 এ আসে, ফিরে আসুন 1. নইলে, পুনরাবৃত্তি করুন 2p-1; যথার্থতা ধরে নিলে, 0 পাওয়ার সামগ্রিক সম্ভাবনা অর্ধেক 1-(2p-1)বা অর্ধেক 1-p

এটি আরও সংক্ষিপ্ত করতে, আমরা এলোমেলো মুদ্রাক্ষেত্র দিয়ে শুরু করি, যা উভয় শাখায় অর্ধেক সময় ফিরে আসে। যদি আমরা যখন এটি ফেরত দেওয়ার কথা বলি তখন মুদ্রাক্ষেত্রটি যদি এটির সাথে মেলে না, 2pমডুলো 1 এ পুনরাবৃত্তি করার ফলাফল দ্বারা এটি প্রতিস্থাপন করুন (এটি যখন p1/2 এর কম হয়, তখন 1 প্রতিস্থাপন করুন; যখন p1/2 এর চেয়ে বেশি হয় , 0 প্রতিস্থাপন এটি প্রতিস্থাপনের সমান ⌈1-2p⌉।)

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