র‌্যান্ড 5 () থেকে র‌্যান্ড 7 () [বন্ধ]


29

আপনি একটি ফাংশন র্যান্ড 5 () সরবরাহ করেছেন। এই ফাংশনটি পুরোপুরি এলোমেলোভাবে (সমান বিতরণ) 1 এবং 5 এর মধ্যে পূর্ণসংখ্যা দেয়।

1 এবং 7 এর মধ্যে পুরোপুরি এলোমেলো পূর্ণসংখ্যার উত্পাদন করতে র্যান্ড 5 () ব্যবহার করে র‌্যান্ড 7 () ফাংশন সরবরাহ করুন।



8
বাধ্যতামূলক xkcd: xkcd.com/221
স্টিভেন রুম্বালস্কি

1 এবং 5 অন্তর্ভুক্ত? অর্থাত্ সেট থেকে {1,2,3,4,5}?
অ্যারন ম্যাকডেইড

1
কোন মানদণ্ড একটি একক বিজয়ী নির্ধারণ করে?
কোজিরো

এই মুহূর্তটি যখন আপনি বুঝতে পারবেন এটি আসলে একটি পুরানো প্রশ্ন।
nyuszika7h

উত্তর:


11

জাভা - 61 অক্ষর

int rand7(){int s=0,c=7;while(c-->0)s+=rand5();return s%7+1;}

বৈধতার জন্য পরীক্ষক ড্রাইভার:

class Rand {

    public static void main(String[] args) {
        int[] nums = new int[7];
        // get a lot of numbers
        for(int i = 0; i < 10000000; i++) nums[rand7()-1]++;
        // print the results
        for(int i = 0; i < 7; i++) System.out.println((i+1) + ": " + nums[i]);
    }

    // just for rand5()
    static java.util.Random r = new java.util.Random();

    static int rand5() {
        return r.nextInt(5)+1; // Random.nextInt(n) returns 0..n-1, so add 1
    }

    static int rand7(){int s=0,c=7;while(c-->0)s+=rand5();return s%7+1;}

}

ফলাফল

C:\Documents and Settings\glowcoder\My Documents>java Rand
1: 1429828
2: 1429347
3: 1428328
4: 1426486
5: 1426784
6: 1429853
7: 1429374

C:\Documents and Settings\glowcoder\My Documents>

10
"অপারেটরে যান"
স্টিভ পি

একটি চাঁচা শেভ? int র্যান্ড 7 () {এর জন্য (ইন্ট এস = 0, সি = 7; সি -> 0; এস + = র্যান্ড 5 ()); এস% 7 + 1; return
রন

3
এই উত্তরটি সঠিক নয়: 1 থেকে 7 এর মানগুলি ফিরিয়ে দেওয়ার এই ফাংশনটির সম্ভাব্যতা যথাক্রমে 0.1430656, 0.1430016, 0.1428224, 0.1426432, 0.1426432, 0.1428224 এবং 0.1430016। হ্যাঁ, ন্যূনতম এবং সর্বাধিক সম্ভাবনার মধ্যে পার্থক্যটি 0.0005 এর চেয়ে কম, তবে এখনও, প্রশ্নটি "নিখুঁতভাবে এলোমেলো পূর্ণসংখ্যা" নির্দিষ্ট করে।
ইলমারি করোনেন

@ ইলমারী আপনি ঠিক বলেছেন - আমি কেবল একটি পরীক্ষা চালিয়েছি এবং মনে হচ্ছে বিতরণটি এমনকি নয় ... আমাকে সে সম্পর্কে ভাবতে দিন ...
corsiKa

1
@ ব্যবহারকারীর: হ্যাঁ, আমি পোস্ট করা সম্ভাব্যতাগুলি আসলে অনুমান নয়, এগুলি নিখুঁতভাবে এলোমেলো ধরে ধরেছে (0.1430656 = 11177/78125, ইত্যাদি) rand5। আমি ম্যাপলে এগুলিকে সাধারণ ম্যাট্রিক্স বীজগণিত ব্যবহার করে গণনা করেছি, তবে আপনি যদি চান তবে কয়েক মিনিটের মধ্যে এটি পেন্সিল এবং কাগজ দিয়ে করতে পারেন। যাইহোক, এটি প্রমাণিত হয়েছে যে ওমর ইতিমধ্যে কয়েক দিন আগে অন্য উত্তরের মন্তব্যে একই পরিসংখ্যান (সান নরমালাইজিং ফ্যাক্টর) পোস্ট করেছেন । (এছাড়াও পি। এস।, আপনি কেবল মন্তব্য অনুসারে একজন ব্যবহারকারীকেই বিজ্ঞপ্তি দিতে পারবেন, যদিও পোস্টের লেখককে সর্বদা সর্বদা অবহিত করা হয়))
ইলমারি করোনেন

7

পার্ল - 47 (ছিল 52) অক্ষর

sub rand7{($x=5*&rand5+&rand5-3)<24?int($x/3):&rand7} 

এছাড়াও আমি টেরিনারি অপারেটর এবং পুনরাবৃত্তি ব্যবহার করতে পারি। সর্বকালের সেরা দিন!

ঠিক আছে, আপনি যদি ডিভের পরিবর্তে মোড ব্যবহার করেন তবে 47 টি অক্ষর:

sub rand7{($x=5*&rand5+&rand5)<27?$x%7+1:&rand7} 

এত কাছাকাছি ... 27 (= 6 + 21) দিয়ে 30 প্রতিস্থাপন করুন এবং আপনি পুরোপুরি অভিন্ন বিতরণ পাবেন। ওহ, এবং আপনি &এটি 46 টি অক্ষরে নামার জন্য শেষ দুটি চিহ্ন ফেলে দিতে পারেন (স্থান সহ যা আপনার বর্তমান সংস্করণটি 48 এ রাখে)।
ইলমারি করোনেন

7

জাভাস্ক্রিপ্ট, 42

Rand7=f=_=>(x=Rand5()+Rand5()*5-5)>7?f():x

বোনাস ইএস 5 জিনিস:

Rand7=eval.bind(0,'for(;x=Rand5()+Rand5()*5-5,x>7;);x')

6

রুবি - 54 টি অক্ষর (লুপ ব্যবহার করে ড্যান ম্যাকগ্রা সমাধানের ভিত্তিতে)

def rand7;x=8;while x>7 do x=rand5+5*rand5-5 end;x;end

রুবি - 45 টি অক্ষর (পুনরাবৃত্তি ব্যবহার করে একই সমাধান)

def rand7;x=rand5+5*rand5-5;x>7 ?rand7: x;end

ব্যবহার করে 1 চর দ্বারা সংক্ষিপ্ত করা যেতে পারে (x=rand5+5*rand5-5)>7?
লার্স হগসেট

5

পাইথনে:

def Rand7():
  while True:
    x = (Rand5() - 1) * 5 + (Rand5() - 1)
    if x < 21: return x/3 + 1

4

সাধারণ লিস্পে 70 টি অক্ষর:

(defun rand7()(let((n(-(+(rand5)(* 5(rand5)))5)))(if(> n 7)(rand7)n)))

প্রথম বন্ধনী আমার চেয়ে বেশি জায়গা নেয়।


খুশী হলাম। না বৈশ্বিক পরিবর্তনশীল তৈরি করে আপনি আরও দুটি অক্ষর বের করতে পারেন:(defun rand7()(setq n(-(+(rand5)(* 5(rand5)))5))(if(> n 7)(rand7)n))
ডঃ পেইন

আরও ভাল:(defun rand7()(if(>(setq n(-(+(rand5)(* 5(rand5)))5))7)(rand7)n))
ড। পেইন

4

সি / সি ++ এ প্রত্যাখ্যানের নমুনা ব্যবহার করে

int rand7(){int x=8;while(x>7)x=rand5()+5*rand5()-5;return x;}

62 অক্ষর।


@ বাররিকার্টার: শর্তটি while(x>7)তাই, কেবলমাত্র বৈধ পরিসরে সংখ্যা দ্বারা সন্তুষ্ট হবে।
মেল্লামোকব

আমার খারাপ। আমার বোবা মন্তব্য মুছে ফেলা হয়েছে।
ব্যারিকার্টার

@ বারারি এবং তারপরে আপনি অন্য একটি রেখে গেছেন। ;)
মতিন উলহাক

আমাকে বুঝতে কয়েক মিনিট সময় লেগেছিল যে এখানে গণিত কীভাবে অভিন্ন র্যান্ডম বিতরণ তৈরি করে যা প্রত্যাখ্যান নমুনার জন্য ব্যবহার করা যেতে পারে।
ড্যানিয়েল

3

উত্তর থেকে ড্যান ম্যাকগ্রা পোস্ট করেছেন, পিএইচপি তে অনুবাদ করুন।

function Rand7(){$x=8;while($x>7)$x=rand5()+5*rand5()-5;return $x;}

67 টি অক্ষর।


এটি "ফাংশন" (এবং একটি স্থান) শব্দ দ্বারা উপস্থাপিত করা উচিত নয়?
jtjacques

হ্যাঁ ... এবং এখন এটি 67 টি অক্ষর ...
মার্ক-

3

আর, 34 টি অক্ষর

আর-তে (পরিসংখ্যানগত গণনার জন্য নির্মিত ভাষা), ইচ্ছাকৃতভাবে ছলচাতুরিযুক্ত সমাধান:

# Construct a Rand5 function
Rand5 <- function() sample(seq(5),1)
# And the golf
Rand7=function(r=Rand5())sample(1:(r/r+6),1)
# Or (same character count)
Rand7=function(r=Rand5())sample.int(r/r+6,1)
# Or even shorter(thanks to @Spacedman)
Rand7=function()sample(7)[Rand5()]

যুক্তিগুলির অলস মূল্যায়নের জন্য ধন্যবাদ, আমি সেমিকোলন এবং ধনুর্বন্ধনীগুলি মুছে ফেলেছি।

10 ^ 6 এর বেশি আউটপুট প্রতিলিপি:

> test <- replicate(10^6,Rand7())
> table(test)
test
     1      2      3      4      5      6      7 
142987 142547 143133 142719 142897 142869 142848 

library(ggplot2)
qplot(test)

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


2
আপনি যদি প্রতারক হতে চলেছেন তবে আপনিও হতে পারেন সেরা প্রতারক:Rand7=function(){r=Rand5();sample(7)[r]}
স্পেসডম্যান

আপনি যদি তা করতে যাচ্ছেন, তবে কেন মধ্যবর্তী স্টোরেজ নিয়ে বিরক্ত করবেন? Rand7=function(){sample(7)[Rand5()]}
ব্রায়ান ডিগস

@ ব্রায়ানডিগস কর্ম-পথে পাথ-নির্ভরতা .... :-)
এরি বি ফ্রেডম্যান

3

স্কেলা, 47, 40 59 চর:

def rand7:Int={val r=5*(rand5-1)+rand5
if(r<8)r else rand7}

র্যান্ড 5 থেকে 2 ইনপুট সহ:

\ 1 2 3 4 5 
1 1 2 3 4 5  
2 6 7 8 ..
3 11 ..
4 ..
5

আমি প্রথম -1 কে 5 দিয়ে গুণ করব এবং দ্বিতীয়টি যুক্ত করব। বেশিরভাগ ফলাফল উপেক্ষা করা হয় এবং একটি নতুন গণনার দিকে পরিচালিত করে। ফলাফলটি 1-25 থেকে মানের সমান বন্টন হওয়া উচিত, যা থেকে আমি কেবল প্রথম 7 টি পছন্দ করি। আমি একটি মডিউল তৈরির সাথে প্রথম 21 গ্রহণ করতে পারি, তবে এটি দীর্ঘ কোডের দিকে নিয়ে যাবে।

historicতিহাসিক কোড যা ব্যর্থ হয়েছে, তবে খুব স্পষ্টভাবে নয়। ইলমারী করোনেনকে এটিকে নির্দেশ করার জন্য ধন্যবাদ:

def rand7=(1 to 7).map(_=>rand5).sum%7+1

এই স্কেল -২.৮.০-পদ্ধতির জন্য যোশিটারু তকেশিতাকে ধন্যবাদ, যা 'সমষ্টি' এত সহজ করে তুলেছে। এর আগে আমার সমাধান:

def rand7=((0/:(1 to 7))((a,_)=>a+rand5-1))%7+1

rand5:

val rnd = util.Random 
def rand5 = rnd.nextInt (5) + 1


ব্যবহারকারী Yoshiteru Takeshita Scala 2.8.0 বা তার পরবর্তী 40 অক্ষর করার জন্য একটি হ্রাস প্রস্তাবিতdef rand7=(1 to 7).map(_=>rand5).sum%7+1
পিটার টেলর

এই সমাধানটিও সঠিক নয়, গ্লোকোডারের উত্তরের মন্তব্য দেখুন ।
ইলমারি করোনেন

@ ইলমারি কারোনেন: আপনি ঠিক বলেছেন - আমি আমার সমাধানটি পুনরায় কাজ করেছি।
ব্যবহারকারী অজানা

3

সি ++

int Rand4()
{
    int r = Rand5();
    return r > 4 ? Rand4() : r;
}

inline int Rand8()
{    
    return (Rand4() - 1) << 2 + Rand4();
}

int Rand7()
{
    int r = Rand8();
    return r > 7 ? Rand7() : r;
}

সি ++ (109)

Golfed

int Rand4(){int r=Rand5();return r>4?Rand4():r;}int Rand7(){int r=Rand4()-1<<2+Rand4();return r>7?Rand7():r;}

আমি সত্যই মনে করি না আপনি এটিকে "ওয়ান লাইনার" বলতে পারেন কারণ সেমিকোলনগুলি সি ++ এ কোডের একটি লাইন সংজ্ঞায়িত করে।
পিটার ওলসন

@ পিটার ওহ ভাল, এটির জন্য এখন আর ওয়ান-লাইনার প্রয়োজন হয় না।
মতিন উলহাক

এটি 1 থেকে 8 পর্যন্ত একটি সংখ্যা ফিরে এসেছে
জিমি 23013

2

ড্যান ম্যাকগ্রা পোস্ট করেছেন উত্তর থেকে জাভাস্ক্রিপ্টে অনুবাদ করুন।

function Rand7(){x=8;while(x>7)x=rand5()+5*rand5()-5;return x}

62 অক্ষর


1
function Rand7(){for(x=8;x>7;x=rand5()+5*rand5()-5);return x}সামান্য খাটো: পি
জিমিনপি

2

জাভাস্ক্রিপ্ট, 85

function Rand7(){for(x=0,i=1;i<8;x^=i*((k=Rand5())%2),i*=1+(k<5));return x?x:Rand7()}

আমি জানি ছোট উত্তর আছে, কিন্তু আমি এই ধাঁধাটির পরীক্ষাটি দেখাতে চেয়েছিলাম । দেখা যাচ্ছে যে ডেন ম্যাকগ্রা-র প্রত্যাখ্যানের নমুনা ব্যবহার করে কেবল ক্লাইড লাবোর উত্তর সঠিক (জেএস উত্তরের মধ্যে)।


2

С ++,

int Rand7()
{
    int r = Rand5();
    int n = 5;
    do {
        r = (r - 1) * 5 + Rand5();
        int m = n * 5 / 7 * 7;
        if (r <= m) {
            return r % 7 + 1;
        }
        r -= m;
        n = n * 5 - m;
    } while (1);
}

নম্বর বিতরণ (1000000 পূর্ণসংখ্যা):

142935 142751 142652 143299 142969 142691 142703

প্রতি উত্পন্ন পূর্ণসংখ্যার প্রতি র‌্যান্ড 5 () তে কলগুলির গড় সংখ্যা প্রায় 2.2 (2 থেকে 10+)।

1 2      3      4     5    6   7 8  9 10
0 840180 112222 44433 2212 886 0 60 6 1

2

জাভাতে (বা সি / সি ++ আমি মনে করি)

  • আলেকজান্দ্র্রু দ্বারা প্রজন্মের সূত্র ব্যবহার করে, 65 টি অক্ষরে:

    int rand7(){int x=rand5()*5+rand5()-6;return x>20?rand7():x/3+1;}
    
  • ড্যান ম্যাকগ্রা দ্বারা প্রজন্মের সূত্র ব্যবহার করে, 60 টি অক্ষরে

    int rand7(){int x=rand5()+5*rand5()-5;return x>7?rand7():x;}
    

1

ক্লোজার - 58 টি অক্ষর

(defn rand7[](#(if(<% 8)%(rand7))(+(rand5)(*(rand5)5)-5)))

1

পাইথন, 56 37 টি অক্ষর

পাইথনে অন্য একটি সমাধান যা ভুল হতে পারে:

rand7 = lambda: sum(rand5() for i in range(7)) % 7 + 1

এটি খুব সহজ বলে মনে হচ্ছে, তবে যখন আমি চেষ্টা করি:

counter = [0] * 7
for i in range(100000):
     counter[rand7()] += 1

আমি যুক্তিসঙ্গত এমনকি বিতরণ পাই (সমস্ত 14000 এবং 14500 এর মধ্যে)।

ঠিক আছে, এখন কেউ যেমন এই পোস্টের পক্ষে ভোট দিয়েছেন: এই সমাধানটি কি সত্যই সঠিক? লোকেদের এটি সমালোচনা করার জন্য আমি আরও এখানে পোস্ট করেছি। ঠিক আছে, যদি এটি সঠিক হয় তবে আমার গল্ফযুক্ত সংস্করণটি হবে:

rand7=lambda:eval("+rand5()"*7)%7+1

যা 37 টি অক্ষরে আসে।


আপনার সমাধানটি সঠিক নয়: আপনি একটি ন্যায্য 5-পার্শ্বযুক্ত ডাই এর 7 রোলগুলিতে আপনার সিদ্ধান্তকে স্থির করেন, যার অর্থ এখানে 5 ^ 7 (5 তম পাওয়ার থেকে 5) সমৃদ্ধযোগ্য ফলাফল রয়েছে। যেহেতু এটি 7 এর একক নয়, আপনি 7 সমকোণযোগ্য ফলাফল দিতে পারবেন না। আমি মনে করি না আপনি যা ফিরে আসবেন তার একটি সহজ সূত্র আছে; আপনি গণনার উপর চাপ প্রয়োগ করতে পারেন বা অল্প সংখ্যক হাতে হাতে এটি কার্যকর করতে পারেন (3 কয়েনকে ফ্লিপ করুন (এইচ = 1, টি = 2) এবং ফলাফলগুলি যোগ করতে পারেন)।
গিলস 'তাই খারাপ হওয়া বন্ধ করুন'

1
বাহ, আপনি যে বিতরণটি উত্পন্ন করেছেন তা অভিন্ন না হলেও উল্লেখযোগ্যভাবে কাছাকাছি: প্রতিটি সংখ্যার সম্ভাব্যতার সঠিক অনুপাতটি {1: 11177, 2: 11172, 3: 11158, 4: 11144, 5: 11144, 6: 11158, 7: 11172}
ওমর



1

পার্ল, 43 টি অক্ষর, পুনরাবৃত্তি প্রত্যাখ্যানের নমুনা

sub rand7{1while($_=5*&rand5-rand5)>6;$_+1}

এটি সম্পর্কে একটি সতর্কতা দেয় Ambiguous use of -rand5 resolved as -&rand5(), কিন্তু সঠিকভাবে কাজ করে। &দ্বিতীয় rand5কলটিতে একটি প্রস্তুত করাও এটি একটি স্ট্রোকের মূল্যে স্থির করে। (বিপরীতে, প্রোটোটাইপ দিয়ে সংজ্ঞায়িত করা হলে অন্যটিও &মুছে ফেলা যায় )) rand5()

গীত। নিম্নলিখিত 46-চর সংস্করণটি প্রায় তিনগুণ দ্রুত:

sub rand7{1while($_=5*&rand5-rand5)>20;$_%7+1}

1

জাভা - 66 অক্ষর

int rand7(){int s;while((s=rand5()*5+rand5())<10);return(s%7+1);}

পূর্বের রুটিনের চেয়ে দীর্ঘ, তবে আমি মনে করি এটি কম সময়ে অভিন্ন বিতরণ করা সংখ্যাগুলি প্রদান করে।


1

পোস্টস্ক্রিপ্ট (46)

এটি বাইনারি টোকেন এনকোডিং ব্যবহার করে, অতএব, এখানে একটি হ্যাক্সডাম্প রয়েছে:

00000000  2f 72 61 6e 64 37 7b 38  7b 92 38 37 92 61 7b 92  |/rand7{8{.87.a{.|
00000010  40 7d 69 66 92 75 32 7b  72 61 6e 64 35 7d 92 83  |@}if.u2{rand5}..|
00000020  35 92 6c 92 01 35 92 a9  7d 92 65 7d 92 33        |5.l..5..}.e}.3|
0000002e

এটা চেষ্টা করে দেখতে, আপনি এটিও করতে পারেন এটা বিনামূল্যে ডাউনলোড

এখানে পরীক্ষামূলক কোডের সাথে একত্রিত ও মন্তব্য করা কোড রয়েছে code

% This is the actual rand7 procedure.
/rand7{
  8{                      % potentialResult
    % only if the random number is less than or equal to 7, we're done
    dup 7 le{             % result
      exit                % result
    }if                   % potentialResult
    pop                   % -/-
    2{rand5}repeat        % randomNumber1 randomNumber2
    5 mul add 5 sub       % randomNumber1 + 5*randomNumber2 - 5 = potentialResult
  }loop
}def

%Now, some testing code.

% For testing, we use the built-in rand operator; 
% Doesn't really give a 100% even distribution as it returns numbers
% from 0 to 2^31-1, which is of course not divisible by 5.
/rand5 {
  rand 5 mod 1 add
}def

% For testing, we initialize a dict that counts the number of times any number
% has been returned. Of course, we start the count at 0 for every number.
<<1 1 7{0}for>>begin

% Now we're calling the function quite a number of times 
% and increment the counters accordingly.
1000000 {
  rand7 dup load 1 add def
}repeat

% Print the results
currentdict{
  2 array astore ==
}forall

-1
int result = 0;

for (int i = 0; i++; i<7)
    if (((rand(5) + rand(5)) % 2) //check if odd
        result += 1;

return result + 1;

2
এটি অভিন্ন বিতরণ দেবে না। র্যান্ডের বিতরণ দেখুন (5) + র্যান্ড (5) 10000 এরও বেশি পুনরাবৃত্তির জন্য কেন দেখুন
gnibbler

ফলাফলটি আপনার কোডে 1 থেকে 8 পর্যন্ত যে কোনও সংখ্যা হতে পারে ...
ওমর

প্লাস, যেমন গনিবলার বলেছিলেন, বিতরণটি অভিন্ন নয়: (র্যান্ড (5) + র‌্যান্ড (5))% 2 0-এর প্রতি পক্ষপাতদুষ্ট, এটি প্রতি 12 বারের জন্য 0 টি 13 বার উত্পাদন করে যা এটি 1 উত্পাদন করে; অর্থাত্, সম্ভাব্যতাগুলি {0: 13, 1: 12 to এর সমানুপাতিক} এই স্বরলিপিটির সাথে, আপনার ফাংশনের সম্ভাবনাগুলি সমানুপাতিকভাবে {1: 62748517, 2: 405451956, 3: 1122790032, 4: 1727369280, 5: 1594494720, 6: 883104768, 7: 271724544, 8: 35831808} (বেশ ভারী হয়ে গেছে বড় সংখ্যা)। বা, 6 বার চালানোর জন্য লুপটি স্থির করে, {1: 4826809, 2: 26733096, 3: 61691760, 4: 75928320, 5: 52565760, 6: 19408896, 7: 2985984}
ওমর

-1

আর (30 টি অক্ষর)

র্যান্ড 7 সংজ্ঞা দিন:

rand7=function(n)sample(7,n,T)

যেহেতু আর পরিসংখ্যানগত বিশ্লেষণকে মাথায় রেখেই লেখা হয়েছিল, এই কাজটি তুচ্ছ, এবং আমি অন্তর্নির্মিত ফাংশনটি sampleপ্রতিস্থাপন সত্যের সাথে সেট করে ব্যবহার করি ।

নমুনা আউটপুট:

> rand7(20)
 [1] 4 3 6 1 2 4 3 2 3 2 5 1 4 6 4 2 4 6 6 1
> rand7(20)
 [1] 1 2 5 2 6 4 6 1 7 1 1 3 7 6 4 7 4 2 1 2
> rand7(20)
 [1] 6 7 1 3 3 1 5 4 3 4 2 1 5 4 4 4 7 7 1 5

1
এটি বলে যে আপনাকে র্যান্ড 5 ব্যবহার করতে হবে। কীভাবে তা বলে না, তবে আপনাকে এটি ব্যবহার করতে হবে ...
স্পেসডম্যান

@ স্পিডম্যান হ্যাঁ, আমি এটিকে স্পষ্টভাবে উপেক্ষা করেছি। এটি অ-রেফারেন্স দ্বারা ব্যবহার।
অ্যান্ড্রি 18

-1

খাঁজকাটা

rand7={if(b==null)b=rand5();(b=(rand5()+b)%7+1)}

35,000 পুনরাবৃত্তির উপরে উদাহরণ বিতরণ:

[1:5030, 2:4909, 3:5017, 4:4942, 5:5118, 6:4956, 7:5028]

এটা রাষ্ট্রীয় যে খারাপ?



-1

এ কেমন?

int Rand7()
{
    return Rand5()+ Rand5()/2;
}

যে ভাষাটিই হোক না কেন, তার /অপারেটর কি পূর্ণসংখ্যার গণিত করে? দশমিক, ভাসমান-পয়েন্ট বা পূর্ণসংখ্যার গণিত হলে আপনার ফলাফলগুলির কী হবে?
কোজিরো

পূর্ণসংখ্যা বিভাজন ধরে নিয়ে, এই ফাংশন নিম্নলিখিত বন্টন রয়েছে: [2/25, 4/25, 5/25, 5/25, 5/25, 3/25, 1/25]। ঠিক অভিন্ন নয়।
প্রিমো

প্রিমো ঠিক আছে। এলোমেলো সংখ্যার যোগ করা সাধারণত সম্ভাব্যতাগুলিকে মাঝারি মানের দিকে ঝুঁকতে দেয়।
gnibbler

-1

জাভা - 54

int m=0;int rand7(){return(m=m*5&-1>>>1|rand5())%7+1;}

বিতরণ পরীক্ষা: [1000915, 999689, 999169, 998227, 1001653, 1000419, 999928]

অ্যালগরিদম:

  • একটি বৈশ্বিক পরিবর্তনশীল রাখুন Keep
  • 5 দিয়ে গুণ করুন, সুতরাং কমপক্ষে উল্লেখযোগ্য শেষে 5 স্থান বিনামূল্যে পান
  • এটি ইতিবাচক করার জন্য সাইন বিটটি কেটে দিন (স্বাক্ষরযুক্ত সংখ্যাগুলি সমর্থন করা হলে প্রয়োজনীয় নয়)
  • মডুলো 7 এর উত্তর

> সংখ্যাগুলি পরস্পরকে আরও অসম্পর্কিত নয়, তবে স্বতন্ত্রভাবে পুরোপুরি এলোমেলো।


-1

রুবি (৪৩ বাইট)

def rand7;(0..7).reduce{|i|i+rand5}%7+1;end

রুবিকে পোর্ট করা cemper93 এর সমাধানটি তিন বাইট কম;) (34 বাইট)

def rand7;eval("+rand5"*7)%7+1;end

-3

সি / সি ++ কোডের কোডটিতে কেবল একটি লাইন থাকে!

static unsigned int gi = 0;

int rand7()
{
    return (((rand() % 5 + 1) + (gi++ % 7)) % 7) + 1;
}

//call this seed before rand7
//maybe it's not best seed, if yo have any good idea tell me please
//and thanks JiminP again, he remind me to do this
void srand7()
{
    int i, n = time(0);
    for (i = 0; i < n % 7; i++)
        rand7();
}

Srand7 () হল র্যান্ড 7 এর বীজ, অবশ্যই র্যান্ড 7 এর আগে এই ফাংশনটি কল করতে হবে ঠিক যেমন সি তে র‌্যান্টের আগে কল শ্রান্ডের মতো call

এটি খুব ভাল, কারণ এটি র্যান্ড () কেবলমাত্র একবারে কল করে এবং কোনও লুপ জিনিস নয়, অতিরিক্ত স্মৃতি ব্যয় করে না।

আমাকে এটি ব্যাখ্যা করতে দিন: 5 আকারের একটি পূর্ণসংখ্য অ্যারে বিবেচনা করুন:

1st get one number from 1 2 3 4 5 by rand5
2nd get one number from 2 3 4 5 6
3rd get one number from 3 4 5 6 7
4th get one number from 4 5 6 7 1
5th get one number from 5 6 7 1 2
5th get one number from 6 7 1 2 3
7th get one number from 7 1 2 3 4

সুতরাং আমরা টেবিলে পেয়েছি, 1-7 এর প্রত্যেকটি এতে 5 বার উপস্থিত হয়েছে এবং এর মধ্যে সমস্ত 35 টি সংখ্যা রয়েছে, সুতরাং প্রতিটি সংখ্যার সম্ভাবনা 5/35 = 1/7 হয়। এবং পরের বার,

8th get one number from 1 2 3 4 5
9th get one number from 2 3 4 5 6
......

পর্যাপ্ত সময়ের পরে, আমরা 1-7 এর অভিন্ন বিতরণ পেতে পারি।

সুতরাং, আমরা লুপ-বাম-শিফট দ্বারা 1-7 এর পাঁচটি উপাদান পুনরুদ্ধার করতে একটি অ্যারে বরাদ্দ করতে পারি, এবং র্যান্ড 5 দ্বারা অ্যারে থেকে প্রতিটি সময় একটি সংখ্যা পেতে পারি। পরিবর্তে, আমরা এর আগে সাতটি অ্যারে তৈরি করতে পারি এবং সেগুলি বিজ্ঞপ্তি দিয়ে ব্যবহার করতে পারি। কোডটিও সহজ, অনেকগুলি শর্ট কোড এটি করতে পারে।

তবে, আমরা% অপারেশনের বৈশিষ্ট্যগুলি ব্যবহার করতে পারি, সুতরাং টেবিল 1-7 সারিগুলি (র্যান্ড 5 + i)% 7 এর সমান, এটি: a = র্যান্ড ()% 5 + 1 সি ভাষায় র্যান্ড 5, বি = জিআই ++ % 7 উপরের সারণীতে সমস্ত ক্রিয়াকলাপ উত্পন্ন করে এবং 0 - 6 1 - 7 c = (a + b)% 7 + 1 প্রতিস্থাপন করে, 1 - 7 অভিন্নভাবে উত্পন্ন করে। অবশেষে, আমরা এই কোড পেয়েছি:

(((rand() % 5 + 1) + (gi++ % 7)) % 7) + 1 

তবে, আমরা প্রথম কলটিতে 6 এবং 7 পেতে পারি না, সুতরাং আমাদের একটি বীজ দরকার, কিছু কিছু সি / সি ++ এ র্যান্ডের জন্য, প্রথম আনুষ্ঠানিক কলের অনুমতি বাতিল করতে to

পরীক্ষার সম্পূর্ণ কোড এখানে:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

static unsigned int gi = 0;

//a = rand() % 5 + 1 is rand5 in C language,
//b = gi++ % 7 generates all permutations,
//c = (a + b) % 7 + 1, generates 1 - 7 uniformly.
//Dont forget call srand7 before rand7
int rand7()
{
   return (((rand() % 5 + 1) + (gi++ % 7)) % 7) + 1;
}

//call this seed before rand7
//maybe it's not best seed, if yo have any good idea tell me please
//and thanks JiminP again, he remind me to do this
void srand7()
{
    int i, n = time(0);
    for (i = 0; i < n % 7; i++)
        rand7();
}

void main(void)
{
    unsigned int result[10] = {0};
    int k;

    srand((unsigned int)time(0)); //initialize the seed for rand
    srand7() //initialize the rand7

    for (k = 0; k < 100000; k++)
        result[rand7() - 1]++;

    for (k = 0; k < 7; k++)
        printf("%d : %.05f\n", k + 1, (float)result[k]/100000);
}

এটি 'পরীক্ষায়' পাস করে তবে এর অর্থ এই নয় যে এটি একটি ভাল এলোমেলো কাজ। একবারে ফোন করে কি পাব 6নাকি ? 7
জিমিনপি

তবে ভাল ধরণের এবং খারাপ ধরণের কাছাকাছি। এবং এই কোডটি খারাপ - কারণ এটি একবারে ডাকা হলে অভিন্ন বিতরণ দেয় না । যদি কেউ এর মতো কিছু লিখে থাকে তবে int main(){if(rand7()==6) printf("Hello, world!");}লুপ ব্যবহার করে আনুমানিকতা 'হ্যালো, ওয়ার্ল্ড!' প্রিন্ট করবে 7 বার 1, কিন্তু আপনার কোড না।
জিমিনপি

আপনাকে ধন্যবাদ জিমিনপি! আপনি প্রথম সময়ে 6,7 এর জন্য সঠিক। কল র্যান্ড 7 এর আগে আমার বীজ বঞ্চিত করতে হবে, বীজ ঠিক সি / সি ++ এর মধ্যে শ্রান্ডের মতো। আমি আমার কোড ঠিক করেছি, এবং আপনাকে আবারও ধন্যবাদ !!!
শান

এইচএম .... srand10 কাজ করে না, শেষ 3 নম্বর 10, 20, 30 এ পজিশন পেতে পারে না ... দুঃখিত @ জিমিনপি, তবে কীভাবে এটি পরিবর্তন করবেন? আমি মনে করি এটি আশাবাদী উপায়।
শান

2
এই ফাংশনটির বিভিন্ন কল একে অপরের থেকে স্বতন্ত্র নয়। এখানে অনুমানটির জন্য এটির প্রয়োজন হয় না, তবে এটি সাধারণত এলোমেলো সংখ্যা জেনারেটরকে ছাড় দেওয়া হয়। অন্যথায়, আপনি বলতে পারেন, প্রথমবার এলোমেলো ইউনিফর্ম নম্বরটি ফিরিয়ে দিন এবং ভবিষ্যতে কলগুলি কেবল ফিরে আসবে (পূর্ববর্তী + 1)% 7 ...
ওমর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.