Rand5 () ila Rand7 () [kapalı]


29

Rand5 () işleviyle sağlanır. Bu işlev, 1 ile 5 arasında tam olarak rasgele (eşit dağılımlı) tamsayılar döndürür.

1 ile 7 arasında kusursuz rasgele tamsayılar üretmek için Rand5 () işlevini kullanan Rand7 () işlevini sağlayın.



8
Zorunlu xkcd: xkcd.com/221
Steven Rumbalski

1 ve 5 dahil mi? yani {1,2,3,4,5} kümesinden?
Aaron McDaid

1
Tek bir kazananı hangi kriterler belirler?
kojiro

Bunu anladığın o an aslında eski bir soru.
nyuszika7h

Yanıtlar:


11

Java - 61 karakter

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

Doğrulama için test sürücüsü:

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;}

}

Sonuçlar

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
"Operatöre gider" için ekstra puan
Steve P

char mı tıraş ettin? int rand7 () {için (int s = 0, c = 7; c -> 0; s + = rand5 ()); dönüş s% 7 + 1;}
Ron

3
Bu cevap doğru değil: 1'den 7'ye kadar değerleri döndüren bu işlevin olasılıkları sırasıyla 0.1430656, 0.1430016, 0.1428224, 0.1426432, 0.1426432, 0.1428224 ve 0.1430016'dır. Evet, minimum ve maksimum olasılıklar arasındaki fark, 0.0005'ten daha azdır, ancak yine de, "mükemmel rastgele tamsayılar" sorusu belirlendi.
Ilmari Karonen

@ilmari Haklısın - Ben sadece bir test yaptım ve dağılışı bile öyle değil ... düşünmeme izin ver ...
corsiKa

1
@ userunknown: Evet, gönderdiğim olasılıklar gerçekte yaklaşık değil, tamamen rasgele olduğunu varsayarlar (0.1430656 = 11177/78125, vb.) rand5. Onları Maple'da basit matris cebiri kullanarak hesapladım, ancak isterseniz birkaç dakika içinde kalemle ve kağıtla yapabilirsiniz. Her neyse, Omar'ın birkaç gün önce başka bir cevaba yaptığı yorumda aynı rakamları (normalleştirici faktör sans) yayınladığı ortaya çıktı . (Ayrıca ps., Her yazıda yalnızca bir kullanıcıyı bildirebilirsiniz, ancak yazının yazarı her zaman her durumda bildirilir.)
Ilmari Karonen

7

Perl - 47 (52 idi) karakter

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

Artı üçlü operatör VE özyinelemeyi kullanabiliyorum. En iyi gün!

Tamam, div yerine mod kullanıyorsanız 47 karakter:

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

O kadar yakın ... 30'u 27 (= 6 + 21) ile değiştirirseniz mükemmel bir forma sahip bir dağılım elde edersiniz. Oh, ve son iki &tabelayı 46 karaktere düşürmek için bırakabilirsiniz (mevcut sürümünüzü 48'e çıkartan alan dahil).
Ilmari Karonen

7

JavaScript, 42

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

Bonus ES5 olayı:

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

6

Ruby - 54 karakter (Dan McGrath çözümüne göre, döngü kullanılarak)

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

Ruby - 45 karakter (özyineleme kullanarak aynı çözüm)

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

1 karakter ile kısaltılabilir (x=rand5+5*rand5-5)>7?.
Lars Haugseth

5

Python'da:

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

4

Common Lisp 70 karakterlerinde:

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

Parantez benden daha fazla yer kaplıyor.


Güzel. Global değişkeni yaparak iki karakteri daha sıkabilirsiniz:(defun rand7()(setq n(-(+(rand5)(* 5(rand5)))5))(if(> n 7)(rand7)n))
Dr. Pain

Daha da iyisi:(defun rand7()(if(>(setq n(-(+(rand5)(* 5(rand5)))5))7)(rand7)n))
Dr. Pain

4

C / c ++ 'da ret örneklemesini kullanarak

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

62 karakter


@ barrycarter: Koşul while(x>7), öyle ki, yalnızca geçerli aralıktaki sayılarla karşılanabilir.
mellamokb

Benim hatam. Aptal yorumumu sildim.
barrycarter

@ barry Sonra bir tane daha bıraktınız. ;)
Mateen Ulhaq

Buradaki matematiğin, reddetme örneklemesi için kullanılabilecek tekdüze bir rasgele dağılım ürettiğini anlamam birkaç dakika sürdü.
Daniel,

3

Dan McGrath tarafından gönderilen cevaplardan PHP'ye çeviri.

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

67 karakter.


Bu, "function" (ve bir boşluk) kelimesi ile önceden yazılmamalı mı?
jtjacques,

Evet ... ve şimdi 67 karakter ...
Marc-François

3

R, 34 karakter

R'de (istatistiksel hesaplama için oluşturulmuş bir dil), kasıtlı olarak aldatıcı bir çözüm:

# 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()]

Argümanların tembel değerlendirmesi sayesinde noktalı virgül ve parantezleri kaldırdım.

10 ^ 6 kopyadan fazla çıktı:

> 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)

sonuçların histogramı


2
Hile yapmayacaksanız, olabileceğiniz en iyi Rand7=function(){r=Rand5();sample(7)[r]}
hileci

Bunu yapacaksanız neden ara depo ile uğraşıyorsunuz? Rand7=function(){sample(7)[Rand5()]}
Brian Diggs

@BrianDiggs Yola bağımlılık eylemi .... :-)
Ari B. Friedman

3

scala, 47, 40 59 karakter:

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

rand5'ten 2 giriş ile:

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

İlk 1'i 5 ile çarptım, ikincisini ekledim. Çoğu sonuç göz ardı edilir ve yeni bir hesaplamaya yol açar. Sonuç, 1-25 arasındaki değerlerin eşit bir dağılımı olmalıdır; bunlardan yalnızca ilk 7'sini seçiyorum. Modulo inşa eden ilk 21'i kabul edebilirdim, ancak bu daha uzun kodlara yol açacaktır.

başarısız olan tarihi kod, ancak çok açık bir şekilde değil. İşaretlediğiniz için Ilmari Karonen'e teşekkürler:

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

Yoshiteru Takeshita sayesinde, 'toplamı' çok kolaylaştıran bu ölçek-2.8.0-yaklaşımı için. Daha önce benim çözümüm:

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

rand5:

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


Kullanıcı Yoshiteru Takeshita , Scala 2.8.0 veya sonraki sürümlerinde 40 karaktere düşürülmesini önerdidef rand7=(1 to 7).map(_=>rand5).sum%7+1
Peter Taylor

Bu çözüm de doğru değil, glowcoder'ın cevabına ilişkin yorumları görün .
Ilmari Karonen

@IlmariKaronen: Haklısın - Çözümümü elden geçirdim.
kullanıcı bilinmeyen

3

C ++

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;
}

C ++ (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;}

Noktalı virgül C ++ 'da bir kod satırı tanımladığı için buna "bir liner" diyebileceğini sanmıyorum.
Peter Olson

@Peter Oh, artık tek bir gömlek bile gerektirmiyor.
Mateen Ulhaq

1'den 8'e kadar bir sayı döndürdü.
jimmy23013

2

Dan McGrath tarafından yazılan cevaptan Javascript'e Çeviri.

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

62 karakter


1
function Rand7(){for(x=8;x>7;x=rand5()+5*rand5()-5);return x}biraz daha kısa: P
JiminP 23:11

2

JavaScript, 85

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

Daha kısa cevap olduğunu biliyorum ama bu bulmacanın testini göstermek istedim . Sadece Clyde Lobo'nun Dan McGrath'ın ret örneklemesini kullanarak verdiği cevabın doğru olduğu ortaya çıktı (JS cevapları arasında).


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);
}

Sayı dağılımı (1000000 tam sayı):

142935 142751 142652 143299 142969 142691 142703

Her üretilen tamsayı için Rand5 () ortalama çağrı sayısı yaklaşık 2,2'dir (2 ila 10+).

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

2

Java'da (veya C / C ++ sanırım)

  • Alexandru tarafından üretilen formülü 65 karakterde kullanarak:

    int rand7(){int x=rand5()*5+rand5()-6;return x>20?rand7():x/3+1;}
    
  • Dan McGrath tarafından üretilen formülün 60 karakter içerisinde kullanılması

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

1

Clojure - 58 karakter

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

1

Python, 56 karakter

Python'da yanlış olabilecek başka bir çözüm:

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

Bu çok basit görünüyor, ama denediğimde:

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

Oldukça eşit bir dağılım elde ettim (hepsi 14000 ve 14500 arasında).

Tamam, şimdi birileri bu yazı için oy kullandı: Bu çözüm gerçekten doğru mu? Bunu daha çok insanların buraya eleştirmesini sağlamak için gönderdim. Eğer doğruysa golf versiyonum şöyle olurdu:

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

37 karaktere çıkıyor.


Çözümünüz doğru değil: kararınızı 7 taraflı, 5 taraflı bir kalıptan elde edersiniz, yani 5 ^ 7 (5 ila 7. güç) denkleştirilebilir sonuçlar vardır. Bu, 7'nin katı olmadığı için, 7 eşlenebilir sonucu geri getiremezsiniz. Getirdiğin şey için kolay bir formül olduğunu sanmıyorum; Hesaplamayı kaba bir şekilde zorlayabilir ya da daha küçük sayılarla el ile halledebilirsiniz (3 jeton çevir (H = 1, T = 2) ve sonuçları toplayabilirsiniz).
Gilles 'SO- kötülük' stop '

1
Vay canına, ürettiğin dağılım, tek biçimli olmasa da, oldukça yakın: her bir sayının olasılıklarının tam oranı {1: 11177, 2: 11172, 3: 11158, 4: 11144, 5: 11144, 6: 11158, 7: 11172)
Omar


1

Python, 70 karakter

def rand7():
 while True:
  n=5*(rand5()-1)+(rand5()-1)
  if n<21:return n%7+1

ama tamamen doğru akıl yürütmeye dayalı burada .


1

Perl, 43 karakter, yinelemeli ret örnekleme

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

Bu, hakkında bir uyarı verir Ambiguous use of -rand5 resolved as -&rand5(), ancak düzgün çalışır. &İkinci rand5aramaya da bir hazırlık yapılması, bir vuruş pahasına sabitlenir . (Buna karşılık, diğer &de çıkarılabilir halinde rand5 bir ile tanımlanmıştır ()prototip).

Ps. Aşağıdaki 46 karakterlik versiyon yaklaşık üç kat daha hızlı:

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

1

Java - 66 karakter

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

Önceki rutinden daha uzun, ancak bunun daha kısa sürede düzgün dağılmış sayıları döndürdüğünü düşünüyorum.


1

PostScript (46)

Bu, ikili kod kodlamasını kullanır, bu nedenle, burada bir hexdump:

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

Denemek için, indirebilirsiniz .

İşte kodlanmış ve yorumlanmış kod, test koduyla birlikte.

% 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
Bu düzgün bir dağılım vermeyecek. Nedenini görmek için 10000 yinelemenin üzerinde rand (5) + rand (5) dağılımına bakın
gnibbler

sonuç kodunuzda 1'den 8'e kadar herhangi bir sayı olabilir ...
Omar

Ayrıca, gnibbler dediği gibi, dağılım tekbiçimli değildir: (rand (5) + rand (5))% 2, 0'a doğru önyargılıdır, ürettiği her 12 kez için 013 kez üretir; yani, olasılıklar {0: 13, 1: 12} ile orantılıdır. Bu gösterimde, işleviniz için olan orantılar {1: 62748517, 2: 405451956, 3: 1122790032, 4: 1727369280, 5: 1594494720, 6: 883104768, 7: 271724544, 8: 35831808} ile orantılıdır daha büyük sayılar). Veya, döngünün 6 kez çalışması için sabitleme, {1: 4826809, 2: 26733096, 3: 61691760, 4: 75928320, 5: 52565760, 6: 19408896, 7: 2985984)
Omar

-1

R (30 karakter)

Rand7'yi tanımla:

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

R, istatistiksel analizler göz önünde bulundurularak yazıldığından, bu görev önemsizdir ve ben yerleşik işlevi sampleTRUE olarak değiştirerek kullanırım.

Örnek çıktı:

> 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
Rand5 kullanmanız gerektiğini söylüyor. Nasıl olduğunu söylemiyor ama kullanmak zorundasın ...
Spacedman

@ Spacedman Evet, açıkça görmezden geldim. Bu referans olmadan kullanmaktır.
Andrie

-1

harika

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

35.000 yineleme üzerinden örnek dağıtım:

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

Durumlu olması kötü mü?



-1

Buna ne dersin?

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

Hangi dilde olursa olsun, /operatörü tamsayılı matematik yapar mı? Ondalık, kayan nokta veya tamsayılı matematik yaparsa sonuçlarınıza ne olur?
kojiro

Tam sayı bölümü varsayıldığında, bu işlev aşağıdaki dağılımına sahiptir: [2/25, 4/25, 5/25, 5/25, 5/25, 3/25, 1/25]. Tam olarak üniforma değil.
primo

primo haklı. rastgele sayılar eklemek genellikle olasılıkları orta değerlere doğru eğirecektir.
gnibbler

-1

Java - 54

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

Dağıtım testi: [1000915, 999689, 999169, 998227, 1001653, 1000419, 999928]

Algoritma:

  • Global değişken tut
  • 5 ile çarpın, böylece en az önemli noktada 5 yer boş olsun
  • Olumlu yapmak için işaret bitini kısaltın (imzasız numaralar destekleniyorsa gerekli değildir)
  • Modulo 7 cevaptır

> Rakamlar artık karşılıklı olarak birbirleriyle ilişkilendirilmemektedir, ancak bireysel olarak mükemmel şekilde rasgeledir.


-1

Yakut (43 bayt)

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

cemper93'ün Ruby'ye taşıdığı çözüm, üç bayt daha kısa;) (34 bayt)

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

-3

C / C ++ kodu çekirdek kodun sadece bir satırı var!

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 (), rand7'nin çekirdeğidir, bu işlevi rand7'den önce çağırmalıdır, tıpkı C'deki rand'dan önceki srand gibi.

Bu çok iyi bir şey, çünkü sadece bir defa rand () diyor, döngü yok, fazladan hatıralar yok.

Açıklayayım: 5 ile bir tamsayı dizisi düşünün:

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

Böylece TABLO'yu aldık, 1-7'nin her biri 5 kez görünür ve 35 sayının hepsine sahiptir, bu nedenle her sayının olasılığı 5/35 = 1 / 7'dir. Ve bir dahaki sefere

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

Yeterli zaman sonra, 1-7 eşit dağılımını elde edebiliriz.

Böylece, 1-7'nin beş elemanını loop-sola kaydırma ile geri yüklemek için bir dizi tahsis edebilir ve her seferinde bir dizi rand5 ile bir sayı alabiliriz. Bunun yerine, yedi dizinin hepsini daha önce oluşturabilir ve dairesel olarak kullanabiliriz. Kod da basittir, bunu yapabilen birçok kısa kod vardır.

Ancak,% işleminin özelliklerini kullanabiliriz, bu nedenle 1-7 tablosu, (rand5 + i)% 7 ile eşdeğerdir, yani: a = rand ()% 5 + 1, C dilinde rand5'tir, b = gi ++ % 7, yukarıdaki tablodaki tüm permütasyonları üretir ve 0 - 6, 1 - 7 c = (a + b) yerine,% 7 + 1, tekdüze 1 - 7 oluşturur. Sonunda şu kodu aldık:

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

Ancak, ilk görüşmede 6 ve 7'yi alamıyoruz, bu nedenle ilk resmi görüşme izinlerini geçersiz kılmak için bazıları C / C ++ 'da rand için srand gibi bir tohumya ihtiyacımız var.

İşte test için tam kod:

#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);
}

'Test'i' geçer ', ancak bu iyi bir rastgele fonksiyon olmadığı anlamına gelmez. Ben alabilir miyim 6ya 7da arayarak kez ?
JiminP

Ama iyi çeşitler ve kötü çeşitlilikler var. Ve bu kod kötüdür - çünkü yalnızca bir kez çağrıldığında düzgün dağılım vermez . Eğer biri şöyle bir şey yazdıysa int main(){if(rand7()==6) printf("Hello, world!");}, döngü kullanarak yaklaşıklık 'Merhaba, dünya!' 7 kez 1, ama kodunuz yok.
JiminP

@JiminP teşekkür ederim! ilk defa 6,7 ​​haklısın. Rand7’yi çağırmadan önce bir tohumya ihtiyacım var, tıpkı C / C ++ 'daki srand gibi. kodumu düzelttim ve tekrar teşekkür ederim !!!
Sean

hm .... srand10 çalışmıyor, son 3 rakam 10, 20, 30 ... pozisyonlarında elde edemiyor. Üzgünüm @JiminP, ama nasıl değiştirilir? Bunun umut verici bir yol olduğunu düşünüyorum.
Sean

2
Bu işleve yapılan farklı çağrılar birbirinden bağımsız değildir. Buradaki teknik bunu gerektirmez, ancak bu genellikle rasgele sayı üreticilerinin beklentisidir. Aksi takdirde, ilk kez rastgele bir üniforma numarası döndürürsünüz ve gelecekteki çağrılar sadece geri döner (önceki + 1)% 7 ...
Omar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.