Berapa banyak dadu yang bisa Anda gulung tanpa menggulirkan angka yang paling mungkin

26

Masalah

Mulai dari n=2dadu:

  • Gulung ndadu, dengan masing-masing angka 1 hingga 6 kemungkinan sama pada setiap dadu.
  • Periksa apakah jumlah mereka sama dengan jumlah ndadu yang paling mungkin , yaitu 3.5*n.
    • Jika mereka sama, hentikan.
    • Jika tidak, cetak n, dan ulangi dari awal dengan n+2dadu

Kode Anda tidak harus melakukan prosedur ini dengan tepat, tetapi harus memberikan output acak yang secara probabilistik setara dengan itu, berdasarkan definisi keacakan kami .

Program Anda harus menampilkan semua angka pada jalurnya sendiri; misalnya, jika programnya mencapai 8 dadu dan menggulirkan angka yang paling mungkin dengan 8 dadu, hasilnya adalah:

2
4
6

Contoh Jalankan

Pada 2 dadu, 7adalah jumlah yang paling memungkinkan. Katakanlah angka-angka yang digulung adalah 2dan 3. Kemudian, Anda akan mencetak 2.

Pada 4 dadu, 14adalah jumlah yang paling memungkinkan. Katakanlah nomor digulung adalah 3, 4, 2, dan 5. Kemudian, jumlahnya adalah 14, jadi program akan berakhir di sini.

Hasil akhir dalam kasus ini adalah "2".

Aturan

zoecarver
sumber
Jawaban ini, sebagaimana adanya, sangat tidak jelas. Apakah ada input, atau apakah itu dimaksudkan untuk menghasilkan output dari tidak ada input sebagai loop? Apakah ada keacakan? Sepertinya saya tidak melihat keacakan.
HyperNeutrino
Ngomong-ngomong, selamat datang di PPCG! :)
HyperNeutrino
Terima kasih, maaf saya sangat baru dalam hal ini. Apa yang membuatnya lebih jelas? Tidak ada input, Anda harus mulai dengan satu mati dan naik setinggi mungkin.
zoecarver
@ keramahan Jadi jika saya mengerti dengan benar, saya seharusnya terus mengeluarkan 2, 4, 6, 8, ...gulungan yang banyak dadu setiap kali sampai saya menekan nomor yang paling mungkin untuk iterasi itu?
HyperNeutrino
5
Terima kasih telah meluangkan waktu untuk mengedit tantangan Anda berdasarkan umpan balik kami! Sebagai catatan, kami memiliki tempat di mana Anda dapat memposting tantangan untuk menyelesaikan beberapa detail sebelum memposting: kotak pasir .
FryAmTheEggman

Jawaban:

17

Python 2 , 70 byte

from random import*
n=2
while eval("+randrange(6)-2.5"*n):print n;n+=2

Cobalah online!

Caranya adalah dengan menghitung penjumlahan dengan evalmemasukkan string seperti apa

'+randrange(6)-2.5+randrange(6)-2.5'

dengan nsalinan ekspresi digabungkan. The randrange(6)output nomor acak dari [0,1,2,3,4,5], yang bergeser turun 2.5untuk memiliki rata-rata 0. Ketika dijumlahkan 0, whilekondisi gagal dan loop berakhir.

Penggunaan alternatif mapadalah 4 byte lebih lama:

from random import*
n=2
while sum(map(randrange,[6]*n))-2.5*n:print n;n+=2

Saya telah menemukan banyak ekspresi sama panjang untuk mati bergeser ke nol, tetapi tidak ada yang lebih pendek

randrange(6)-2.5
randint(0,5)-2.5
randrange(6)*2-5
uniform(-3,3)//1
Tidak
sumber
11
Saya suka yang ini! Terutama karena itu adalah satu-satunya yang saya mengerti.
zoecarver
7

MATL , 13 byte

`@E6y&Yrs@7*-

Cobalah online!

Penjelasan

`       % Do...while top of the stack is truthy
  @E    %   Push 2*k, where k is the iteration index starting at 1
  6     %   Push 6
  y     %   Duplicate 2*k onto the top of the stack
  &Yr   %   Array of 2*k integers distributed uniformly in {1, 2, ..., 6}
  s     %   Sum
  @7*   %   Push 7*k
  -     %   Subtract
        % End (implicit). If the top of the stack is non-zero, the loop
        % proceeds with the next iteration. Else the loop is exited.
        % Display stack (implicit)
Luis Mendo
sumber
6

Jelly ,  19  14 byte

-5 byte dengan bantuan dari Leaky Nun (bergerak dari hitungan hingga rekursi)

‘‘6ṗX_3.L⁶S?Ṅß

Program lengkap mencetak hasil yang dipisahkan oleh baris baru (ruang tambahan dan baris baru juga dicetak, dan kesalahan program pada akhirnya).

Cobalah online! - Setiap saat 6 dadu dilampaui TIO membunuh ini karena penggunaan memori, tetapi pada prinsipnya bekerja - itu juga membutuhkan ~ 40s untuk melakukannya.

Versi 15 byte yang lebih ramah yang tidak memakan waktu lama atau membutuhkan banyak memori tersedia di sini .

Bagaimana?

Gulung 2 dadu secara rekursif hingga jumlah wajah masing-masing berkurang 3,5 adalah nol, mencetak jumlah dadu saat berjalan, ketika nol tercapai, upaya untuk menggunakan karakter spasi menyebabkan kesalahan jenis.

‘‘6ṗX_3.L⁶S?Ṅß - Main link: no arguments (implicit left=zero)
‘              - increment (initial zero or the previous result)
 ‘             - increment  (= # of dice to roll, n)
  6            - literal 6
   ṗ           - Cartesian power - all possible rolls of n 6-sided dice with faces 1-6
    X          - pick one of them
      3.       - literal 3.5
     _         - subtract 3.5 from each of the roll results
           ?   - if:
          S    -          sum the adjusted roll results (will be 0 for most common)
        L      - ...then: length (number of dice that were rolled)
         ⁶     - ...else: literal ' ' (causes error when incremented in next step)
            Ṅ  - print that plus a newline
             ß - call this link with the same arity (as a monad with the result)
Jonathan Allan
sumber
Wow, itu sangat sedikit byte. Sudah selesai dilakukan dengan baik! Saya menunda untuk menerimanya sampai beberapa orang lagi menjawab.
zoecarver
Ya itu normal untuk menunggu beberapa saat sebelum menerima, bahkan jika pernah melakukannya. Banyak orang memberikannya satu atau dua minggu.
Jonathan Allan
juga, Anda seharusnya menampilkan semua iterasi - bukan hanya yang terakhir.
zoecarver
Oh, saya menjawab suntingan lama - yang benar-benar mengubahnya, saya tidak bisa menggunakan metode ini dalam banyak cara.
Jonathan Allan
Oh, tunggu sebentar n, oke mungkin bisa diselamatkan. Saya pikir Anda maksudkan jumlahnya :)
Jonathan Allan
6

TI-BASIC, 28 byte

2→N
While mean(randInt(1,6,N)-3.5
Disp N
N+2→N
End

Penjelasan

  • randInt(1,6,N) menghasilkan daftar nomor acak N dari 1 hingga 6
  • mean(randInt(1,6,N)-3.5 mendapat rata-rata gulungan bergeser ke bawah sebesar 3,5
  • While berlanjut sampai ekspresi rata-rata sama dengan nol (jumlah yang paling mungkin)
andrewarchi
sumber
5

R , 49 byte

n=2
while(sum(sample(6,n,T)-3.5)){print(n)
n=n+2}

sample(6,n,T)Menghasilkan n(pseudo) sampel acak dari kisaran 1:6dengan penggantian. Mengurangkan 3,5 dari setiap elemen menghasilkan hasil yang sum0 (falsey) jika dan hanya jika itu adalah nilai yang paling umum.

Cobalah online!

Melompati gulungan dadu yang aneh.

Giuseppe
sumber
Ini sepertinya menghasilkan 80 setiap kali bagi saya, mungkin bug?
zoecarver
@ maaf Anda dapat menambahkan spasi di bagian akhir untuk mencobanya lagi; itu caching input / potongan kode setiap kali
Giuseppe
3
@ Giuseppe Anda dapat menonaktifkan cache di TIO di bawah Pengaturan.
xnor
setelah saya menonaktifkan cache seperti kata @xnor, Ini berfungsi dengan sangat baik. Terima kasih atas jawabannya!
zoecarver
@ xnor, siapa tahu! Senang tahu di masa depan.
Giuseppe
4

Java 8, 123 149 113 108 byte

()->{for(int n=0,s=1,i;s!=n*7;){for(i=s=++n*2;i-->0;s+=Math.random()*6);if(s!=n*7)System.out.println(n*2);}}

Atau 107 byte jika kita menggunakan sebuah Object nullsebagai parameter yang tidak terpakai sebagai gantinya.

+26 byte untuk perbaikan bug, ditunjukkan dengan benar oleh @Jules di komentar.
-41 bytes berkat pemikiran hebat @ OliverGrégoire !

Penjelasan:

Coba di sini.

()->{                           // Method without parameter nor return-type
  for(int n=0,                  //  Amount of dice
          s=1,                  //  Sum
          i;                    //  Index
      s!=n*7;){                 //  Loop (1) as long as the sum doesn't equal `n`*7,
                                //  because we roll the dice per two, and 3.5*2=7
    for(i=s=++n*2;              //   Reset both the index and sum to `n`*2,
                                //   so we can use random 0-5, instead of 1-6
                                //   and we won't have to use `+1` at `Math.random()*6`
        i-->0;                  //   Inner loop (2) over the amount of dice
        s+=Math.random()*6      //    And increase the sum with their random results
    );                          //   End of inner loop (2)
    if(s!=n*7)                  //   If the sum doesn't equal `n`*7
      System.out.println(n*2);  //    Print the amount of dice for this iteration 
  }                             //  End of loop (1)
}                               // End of method
Kevin Cruijssen
sumber
1
Saya pikir ada kesalahan dalam fungsinya. Jika rsama 3.5*ndengan program harus diakhiri secara langsung. Tapi, jika saya mengerti fungsinya dengan benar, itu akan mencetak untuk nterakhir kalinya sebelum mengakhiri.
raznagul
@raznagul Sebenarnya, itu tidak mencetak waktu tambahan. Namun disadap. Apa yang dilakukan sebelumnya: acak 1-12 (bug 1: seharusnya 2-12); periksa apakah ini sama dengan 7: jika ya: kita selesai tanpa mencetak; jika tidak: roll 2 dadu lagi (bug 2, seharusnya sudah 4 dadu bukan 2 lagi); lalu cetak 2, dan naikkan n2. Jadi, memang ada dua bug (1-12 bukannya 2-12; dan dadu bergulir seperti 2 -> 2 -> 4 -> 6 -> ..., bukannya 2 -> 4 -> 6 -> ...). Namun itu mencetak dengan benar, karena itu tidak akan pergi ke System.out.println(n),n+=2jika rmemang sama dengan 3.5*n.
Kevin Cruijssen
2
"Gulirkan dua dadu sekaligus, dengan memilih angka acak dari 2-12" - ini tidak secara probabilistik setara dengan menggulirkan dua dadu dan menambahkan angka-angka sebagaimana diperlukan dalam pertanyaan, oleh karena itu bukan solusi yang benar.
Jules
1
Lebih pendek dengan beberapa byte (113), tapi mungkin masih golfable: ()->{for(int n=2,s=0,e=7,i;s!=e;n+=2,e+=7){for(i=n,s=n;i-->0;)s+=Math.random()*6;if(s!=e)System.out.println(n);}}. Juga, benar dalam hal komentar Jules dan penjelasan saya. nadalah dadu, sjumlah, ediharapkan, iadalah indeks. Akhirnya, jumlah dimulai dengan nuntuk menghindari +1,, nkali, dan s!=ediulang karena saya tidak tahu bagaimana menghindari kasus itu.
Olivier Grégoire
1
Saya bermain golf sedikit lagi;)()->{for(int i=0,s=1,j;s!=i*7;){for(j=s=++i*2;j-->0;)s+=Math.random()*6;if(s!=i*7)System.out.println(i*2);}}
Olivier Grégoire
3

05AB1E , 22 20 byte

-2 Bytes terima kasih kepada Emigna

[YF6L.RO}7Y*;ïQ#Y=ÌV

Cobalah online!

Penjelasan

[YF6L.RO}7Y*;ïQ#Y=ÌV
[                    # Infinite loop start
 YF     }            # Y times... (Y defaults to 2)
   6L.R               # Push a random number between 1 and 6 (why does this have to be so looooong ._.)
       O              # Sum
         7Y*;ï       # Push 3.5 * Y as an int
              Q      # Is it equal to 3.5 * Y?
               #     # If so: Quit
                Y    # Push Y
                 =   # Print without popping
                  ÌV # Set Y to Y + 2
Datboi
sumber
1
Jika Anda pindah Osetelah .RAnda dapat menghapus )dan s.
Emigna
3

R, 48 44 42 byte

Peningkatan 5 byte pada jawaban Giuseppe .

while(sum(sample(6,F<-F+2,1)-3.5))print(F)

Ini (ab) menggunakan fakta yang Fmerupakan variabel secara default ditugaskan untuk FALSEmemaksa 0dan kemudian dapat ditingkatkan, menghemat kita perlu menginisialisasi variabel counter.

rturnbull
sumber
1
tentu saja, Anda dapat menyimpan dua byte dengan menelepon sample(6)alih-alih sample(1:6)tetapi mencoret 44 masih 44 .... codegolf.stackexchange.com/a/82343/67312
Giuseppe
@ Giuseppe Tentu saja, terima kasih! Saya sudah mengedit jawabannya sekarang.
rturnbull
2

PHP , 75 byte

for($d=2;(++$i*7/2-$r+=rand(1,6))||$i<$d;)$i%$d?:$d+=1+print"$d
".$r=$i="";

Cobalah online!

Jörg Hülsermann
sumber
1
5^2/++$i*$d+=rand()%6adalah kondisi yang sedikit lebih pendek untuk loop. Juga saya pikir loop saat ini salah keluar jika "dadu" pertama digulung adalah "1" (menghasilkan 0 untuk awal $d).
user59178
@ user59178 Ide Bagus tapi itu bisa membuat pembagian dengan kesalahan nol jadi saya harus memodifikasinya. Anda benar solusi saya sebelum berhenti dalam hal ini yang salah.
Jörg Hülsermann
Jawaban 45 byte Anda tidak valid karena distribusi yang dihasilkan tidak sama seperti pada pertanyaan, lihat di sini . Jawaban 42 byte Anda, saya pikir, juga menggunakan distribusi yang salah; misalnya, anggaplah bahwa untuk dua dadu, kemungkinan besar memiliki 2 dan 7 sebagai jumlah.
@Pakk Ya jawaban 45 Byte tidak valid. Saya pikir pemikiran Anda salah apa yang terjadi pada Versi 42 Byte. Lihat versi saya yang diperluas Cobalah secara online!
Jörg Hülsermann
@ JörgHülsermann Versi yang diperluas itu menegaskan apa yang saya katakan. Dalam implementasi yang tepat, nilai $ r / $ i harus mendekati 3,5 untuk nilai lebih besar dari $ i, tapi saya tidak melihat itu terjadi sama sekali. Saya mendapat rata-rata 1,16 untuk dadu 9984, yang secara statistik sangat tidak mungkin.
1

GolfScript , 41 byte

0{2+.n\.[{6rand.+5-}*]{+}*!!*.}{}while;;;

Cobalah online!

Biarawati Bocor
sumber
1

Mathematica, 47 byte

For[n=1,Tr@RandomInteger[5,2n++]!=5n,Print[2n]]

-5 byte dari LLlAMnYP

J42161217
sumber
1

05AB1E , 17 byte

[N·ÌD6Lã.R7;-O_#,

Cobalah online!

Penjelasan

[                   # loop over N in 0...
 N·Ì                # push N*2+2
    D               # duplicate
     6L             # push range [1 ... 6]
       ã            # cartesian product (combinations of N*2+2 elements in range)
        .R          # pick one at random
          7;-       # subtract 3.5 from each dice roll
             O_#    # if sum == 0 exit loop
                ,   # otherwise print the copy of N*2+2
Emigna
sumber
1

Batch, 109 byte

@set/an=%1+2,s=n*5/2
@for /l %%i in (1,1,%n%)do @call set/as-=%%random%%%%%%6
@if %s% neq 0 echo %n%&%0 %n%

Agak menjengkelkan, randomadalah variabel lingkungan ajaib, jadi itu hanya akan diganti dengan nilai acak selama ekspansi lingkungan, yang biasanya terjadi sebelum for loop dimulai. callmembuatnya terjadi setiap kali melalui loop, tetapi kemudian Anda harus menggandakan %tanda - tanda untuk mencegah ekspansi terjadi sebelum loop. Kesenangan dimulai karena kami ingin memodulasi hasil dengan 6, yang membutuhkan %tanda nyata , yang sekarang harus digandakan dua kali. Hasilnya adalah enam %s berturut-turut .

Neil
sumber
1

JavaScript (ES2015), 75 78 byte

f=(n=2)=>[...Array(n)].reduce(a=>a+Math.random()*6|0,n)==3.5*n?'':n+`
`+f(n+2)

Menghasilkan serangkaian hasil yang dipisahkan oleh baris baru

Sunting: menyimpan satu byte berkat Shaggy, menambahkan 4 byte untuk memulai fungsi pada 2

Penjelasan

f=n=>
  [...Array(n)]                // Array of size n
    .reduce(                   // Combine each item
      a=>a+Math.random()*6|0,  // Add a random roll between 0 and 5 for each item
    n)                         // Start at n to correct rolls to between 1 and 6
    ==3.5*n                    // Compare total to most probable roll total
  ? ''                         // If true, end
  : n+'\n'+f(n+2)              // Otherwise, output n and continue

f=(n=2)=>[...Array(n)].reduce(a=>a+Math.random()*6|0,n)==3.5*n?'':n+`
`+f(n+2)

let roll = _ => document.getElementById('rolls').innerHTML = f();
document.getElementById('roll-button').onclick = roll;
roll();
<button id="roll-button">Roll</button>
<pre id="rolls"></pre>

andrewarchi
sumber
2
Simpan byte dengan menggunakan baris baru literal yang terlampir dalam backticks, bukan '\n'.
Shaggy
Ini tidak dimulai dengan n=2, sebaliknya Anda harus menentukan jumlah awal dadu ketika fungsi dipanggil.
MT0
1

php - 89 Karakter

$r=0;$n=2;while($r!=$n*3.5){$r=$i=0;while($i<$n){$r+=rand(1,6);$i++;}print $n."
";$n+=2;}
aslum
sumber
Anda tidak perlu $r=0;menggunakan pertama echoalih-alih print $n."dapat menulis sebagai "$ndan untuk loop alih-alih sementara memungkinkan melakukan sesuatu di loop setelah atau sebelum untuk menyimpan beberapa byte
Jörg Hülsermann
1

C (gcc) , 84 80 79 77 75 80 78 76 byte

i;f(s,j){for(;s;s?printf("%d\n",i):0)for(j=i+=2,s=i*7/2;j--;)s-=1+rand()%6;}

Cobalah online!

Cleblanc
sumber
1

Haskell 133 132 byte

import System.Random;import Control.Monad
s k=do n<-replicateM k$randomRIO(1,6);if sum n==7*div k 2 then pure()else do print k;s(k+2)

Kredit ke @Laikoni untuk saran di komentar di bawah.

Davide Spataro
sumber
1.) Impor harus dihitung dalam jumlah byte. 2.) return()dapat dipersingkat menjadi pure()dan putStrLn$showdapat dipersingkat menjadi print.
Laikoni
Saya akan segera memperbaikinya. Terima kasih
Davide Spataro
Beberapa hal kecil lebih lanjut: div k 2 thendapat div k 2thendan do print k;s(k+2)sedang print k>>s(k+2).
Laikoni
1

Oktaf 55 byte

n=2;
while mean(randi(6,n,1))-3.5!=0
n
n=n+2;
end

Terinspirasi oleh jawaban Andrewarchi. Jika seseorang memiliki petunjuk untuk mempersingkat, mereka dipersilakan.

Michthan
sumber
Wow, TI-BASIC dan Octave secara mengejutkan memiliki sintaks yang sama
andrewarchi
@andrewarchi Octave (versi online adalah apa yang saya gunakan) hanyalah dasar-dasar dari dasar ketika datang ke pemrograman.
Michthan
1

Pyth , 20 byte

K2WnsmhO6K*K3.5K=+K2

Cobalah online!

qwertz
sumber
Selamat datang di PPCG!
Martin Ender
Terima kasih! Baru saja menyelesaikan tutorial Pyth dan berpikir saya mungkin akan mencobanya, walaupun ini mungkin masih bisa diperbaiki. Ada saran yang dihargai.
qwertz
0

QBIC , 40 byte

{[1,r|g=g+_r1,6|]~g=r*3.5|_X\g=0?r┘r=r+2

Hal ini benar-benar melakukan apa yang diminta oleh tantangan; tampaknya cara terpendek untuk mendapatkan distribusi yang tepat.

Penjelasan

{          DO infinitely
[1,r|      FOR a=1, a<=r (at start, r == 2), a++
g=g+       Add to g (0 at start)
  _r1,6|   a random number between 1 and 6 incl.
]          NEXT
~g=r*3.5   IF the result of all dice rolls equals the expected value
|_X        THEN quit
\g=0       ELSE, reset the dice total
?r┘        PRINT the number of dice used
r=r+2      and add 2 dice.
           END IF and LOOP are courtiously provided by QBIC at EOF.
steenbergh
sumber
0

JavaScript (ES6) - 69 Karakter

r=n=>n?r(n-1)+(Math.random()*6|0)-2.5:0;f=(n=2)=>r(n)?n+`
`+f(n+2):""

console.log(f())

Penjelasan :

r=n=>                                     # Roll n dice
     n?                                   # If there is a dice left to roll
       r(n-1)                             #   Roll n-1 dice
             +(Math.random()*6|0)         #   Add a random number from 0 .. 5
                                 -2.5     #   Subtract 2.5 so sum of average is 0
                                     :0   # Else total is 0

dan:

f=(n=2)=>                                 # Start with n = 2
         r(n)                             # Roll n dice
             ?n+"\n"+f(n+2)               # If non-zero then concatenate n, newline and
                                          #    result for n+2 dice
                           :""            # If zero (average) terminate.
MT0
sumber
0

Calc2 0.7, 119 118 111 byte

using"runtime";for(n=2,d=0;d!=3.5*n;Console.WriteLine(n),n+=2)for(i=d=0;i++<n;)d+=Math.Int(Random().Next(1,7));

ungolfed:

using "runtime";
var d = 0;
var r = Random();
for(var n = 2; d != 3.5 * n; Console.WriteLine(n), n += 2)
{
    d = 0;
    for(var i = 0; i < n; i++)
        d += Math.Int(r.Next(1,7));
}

Saya bisa melakukannya tanpa Math.Int () tapi sayangnya di 0.7 fungsi Random (). Next () memiliki bug di mana mereka semua mengembalikan dua kali lipat bukan int. Itu sudah diperbaiki tetapi hanya setelah pertanyaan ini diposting. Saya tidak akan memenangkan apa pun, tapi hei, bukti konsep yang bagus.

Edit:

  • menghapus ruang yang tidak perlu antara penggunaan dan "runtime" (-1 byte)

Sunting2:

  • menghapus var r dan membuat Random baru di tempat yang dibutuhkan (-4 byte)

  • berubah i = 0, d = 0 ke i = d = 0 (-2 byte)

  • bertambah setelah pemeriksaan (-1 byte)

hstde
sumber
0

Ruby , 52 byte

s=x=2;(s=0;p x.times{s+=rand(6)-2.5};x+=2)while s!=0

Penjelasan

s=x=2;                                                # sum=2, x=2
      (                                  )while s!=0  # while sum != 0:
       s=0;                                           #  reset the sum
           p                                          #  print
             x.times{              };                 #  repeat x times:
                     s+=                              #   Add to sum:
                        rand(6)                       #    random int in 0..5
                               -2.5                   #    subtract average
                                                      #  (implicitly return x for printing)
                                     x+=2             #  Increment x by 2

Cobalah online!

Nilai Tinta
sumber
@ Pakk perhatikan s=0di bagian depan loop dan penggunaan x.times. Ini berarti jumlah diset ulang setiap kali dan kemudian xdadu digulung, yang seharusnya merupakan distribusi yang benar. Saya akan menulis penjelasan tentang kode saya.
Value Ink
Anda benar, saya terlalu cepat dengan kesimpulan saya.
0

Javascript, 87 karakter

for(n=2;eval('+'.repeat(n).replace(/./g,x=>x+(Math.random()*6|0)))!=2.5*n;n+=2)alert(n)

Uji dengan console.logalih - alih alert:

for(n=2;eval('+'.repeat(n).replace(/./g,x=>x+(Math.random()*6|0)))!=2.5*n;n+=2)console.log(n)
console.log('Done')

Qwertiy
sumber
0

lua, 102 byte

function r(n,t) for d=1,n do t=t+math.random(1,6)end return t==n*3.5 or print(n)or r(n+2,0)end r(2,0)

Atau versi yang lebih mudah dibaca

function r(n,t) --recursive function does its magic, t is given to safe usage bytes(no local)
    for d=1,n do --roll n dice and count them up to the total (t)
         t =t+math.random(1,6)
    end 
    return t==n*3.5 or --check if t==n*3.5. If it is then it ends
           print(n) or --t != n*3.5 thus print n. print returns nil
           r(n+2,0) --both the check and the return value from print are false thus r gets executed.
end 
r(2,0) --start the process

Versi yang lebih curang untuk 96 byte

function r(n,t,m)t=t+m(1,6)+m(1,6)return t==n*3.5 or print(n)or r(n+2,t,m)end r(2,0,math.random)

Ini cukup banyak bekerja sama dengan yang pertama tetapi menggunakan kembali gulungan dari panggilan sebelumnya. Karena ini saya dapat menghapus for loop. Keduanya diuji dalam lua 5.2

lenscas
sumber
0

Perl 6 , 48 byte

.say for 2,*+2...^{3.5*$_==sum (1..6).pick xx$_}
Sean
sumber
-1

PHP, 51 byte

$r=2;$n=2;while(rand(0,6)-2.5*$r){print $n;$n=$n+2;}
Siwa
sumber
Jika output Anda selalu 2, maka ini bukan jawaban yang valid ...
Jika kita mencetak $ n di dalam while, maka ia akan mencetak yang berikut: 2,4,6,8,10 .....
Shiva
2
Namun, saya tidak melihat bagaimana ini mengikuti persyaratan dalam pertanyaan. Anda menggunakan dua variabel: "$ n" dan "n". "n" tidak terdefinisi, jadi akan diatur ke nol. Jadi secara efektif, apa yang Anda lakukan adalah mencetak nomor genap, dan memiliki peluang 5/6 untuk mencetak nomor genap berikutnya. Ini secara matematis tidak setara dengan distribusi dalam pertanyaan.
Typo, n itu harus selalu 2, diperbarui kode.
Shiva
Masih tidak seperti apa yang ditanyakan ... Sekarang Anda melempar dadu, periksa apakah lima (= 2 * 2.5); jika mati lima, Anda berhenti, dan jika bukan lima, Anda menulis angka genap berikutnya dan melanjutkan. Secara matematis sama efektifnya dengan apa yang Anda lakukan di versi kode sebelumnya.