1 / N probabilitas

29

Karena tidak ada cukup tantangan sederhana :

Buat program atau fungsi opsional yang tidak disebutkan namanya yang, diberikan (dengan cara apa pun) bilangan bulat 1 ≤ N ≤ 10000, mengeluarkan nilai True bahasa Anda dengan probabilitas pseudo-acak 1 / N, False sebaliknya.

Harap perhatikan bahwa persyaratan untuk penamaan telah dihapus. Merasa bebas untuk mengedit jawaban dan skor yang sesuai.

Beberapa bahasa menggunakan 1 (atau -1) dan 0 untuk Benar dan Salah, itu juga baik.

Contoh:

Contoh tes input:

4 -> True
4 -> False
4 -> False
4 -> False
4 -> False
4 -> True
4 -> False
4 -> False

Yaitu diberikan 4; mengembalikan Benar dengan peluang 25% dan Salah dengan peluang 75%.

Adm
sumber
2
Meta post yang relevan
FryAmTheEggman
1
Juga meta postingan yang relevan .
AdmBorkBork
Karena tidak semua bahasa telah membangun "pseudorandomness", mungkinkah untuk mendapatkan seed sebagai argumen kedua? (Misalnya Brainfuck)
flawr
@ flawr gunakan milidetik saat ini ...
Adám
1
Apa yang terbesar yang Nharus kita terima?
Toby Speight

Jawaban:

27

Templat MediaWiki dengan ParserFunctions , 48 byte

{{#ifexpr:1>{{#time:U}} mod {{{n}}}|true|false}}
DuhHello
sumber
13
Pilihan bahasa yang menarik :-)
Adám
6
Siapa yang berpikir akan masuk akal untuk menambahkan fungsi non-deterministik ke template MediaWiki !?
user253751
4
@immibis: baik non-determinisme terjadi #time, mungkin untuk memperbarui usia orang yang hidup, dll.
Willem Van Onsem
15

Pyth, 3 byte

!OQ

Cobalah online

Pembalikan sederhana dari pilihan acak dari 0 ke input

Menariknya dalam Pyth tidak mungkin untuk membuat fungsi yang melakukan ini tanpa $karena fungsi Pyth secara otomatis memoize.

FryAmTheEggman
sumber
1
Itu mungkin.
Leaky Nun
@ LeakyNun Ah benar, saya lupa menggunakan waktu untuk fungsi acak, itu agak pintar.
FryAmTheEggman
Tidak, saya hanya menggunakan waktu untuk menghapus memo itu.
Leaky Nun
1
Saya sadar, saya kira saya tidak mengatakannya dengan baik: P Itu mengatakan saya tidak berpikir itu akan benar-benar berfungsi sebagai solusi untuk sebagian besar pengiriman, jika itu lebih baik daripada program lengkap untuk beberapa alasan. Meluangkan waktu sebagai argumen mungkin tidak hanya diizinkan secara default.
FryAmTheEggman
1
@ LeakyNun Saya percaya pertanyaan ini ada sebelum Qmengisi, karena kalau tidak saya akan menjawab !O;)
FryAmTheEggman
12

CJam, 5 byte

Harus cepat dengan yang ini ...

rimr!

Uji di sini.

Penjelasan

ri e# Read input and convert to integer N.
mr e# Get a uniformly random value in [0 1 ... N-1].
!  e# Logical NOT, turns 0 into 1 and everything else into 0.
Martin Ender
sumber
11
" Harus cepat dengan yang ini ... " yang merupakan alasan untuk tidak setuju dengan OP bahwa " tidak ada cukup tantangan kode-golf ". Jika FGITW adalah masalah, IMO itu terlalu sederhana.
Peter Taylor
12

TI-BASIC, 4 byte menggunakan token satu byte

not(int(Ansrand

Menentukan apakah bagian integer dari input kali angka acak dalam [0,1) adalah nol. Ansrand<1juga berfungsi.

lirtosiast
sumber
Bagaimana ... Apakah itu empat byte?
John Dvorak
3
@JanDvorak Bytes pertama bukan (, yang berikutnya adalah int (, yang berikutnya adalah Ans, yang berikutnya adalah rand. Secara umum, kalkulator grafik tidak menggunakan ASCII sebagai representasi internal mereka untuk program.
user253751
@immibis Secara umum, komputer juga tidak menggunakan ASCII. Ini mungkin dipertanyakan, apakah ada diskusi meta tentang itu?
Kroltan
7
@ Kroltan Ya; ini adalah diskusi meta, dan ini adalah daftar token yang satu byte, yang mencakup keempat yang saya gunakan.
lirtosiast
@ThomasKwa terima kasih!
Kroltan
11

MATL, 5 byte

Tiga versi berbeda dari yang ini, semuanya panjangnya 5.

iYr1=

yang mengambil input ( i), menghasilkan integer acak antara 1 dan angka itu ( Yr), dan melihat apakah itu sama dengan 1 ( 1=). Kalau tidak,

li/r>

membuat 1 ( l, solusi karena ada bug dengan melakukan 1isaat ini), ambil input ( i), bagi untuk mendapatkan 1 / N ( /), buat angka acak antara 0 dan 1 ( r), dan lihat apakah acak jumlahnya lebih kecil dari 1 / N. Atau,

ir*1<

ambil dan masukkan ( i), dan kalikan dengan angka acak antara 0 dan 1 ( r*), dan lihat apakah hasilnya lebih kecil dari 1 ( 1<).

Di Matlab, bukan MATL, Anda dapat melakukan fungsi anonim ini

@(n)n*rand<1

untuk 12 byte, yang digunakan dengan melakukan ans(5), misalnya.

David
sumber
10

JavaScript ES6, 15 byte

-5 byte berkat Downgoat.

x=>1>new Date%x

Berdasarkan off (penggunaan) dari ini teknik jawaban ini.

Conor O'Brien
sumber
1
new Datejuga dapat bekerja dan mungkin menghemat beberapa byte
Downgoat
@Downgoat Ah, benar, Keacakan tanggal!
Conor O'Brien
10

Julia, 17 16 15 byte

n->2>rand(1:n)

Ini adalah fungsi yang menghasilkan bilangan bulat acak antara 1 dan ndan menguji apakah kurang dari 2. Akan ada peluang 1 / n dari hal ini terjadi, dan dengan demikian peluang 1 / n untuk kembali true.

Disimpan 1 byte berkat Thomas Kwa!

Alex A.
sumber
9

Microscript II , 3 byte

NR!

Membaca bilangan bulat n, menghasilkan bilangan bulat acak antara 0dan n-1(inklusif), lalu menerapkan negasi boolean ke nilai tersebut.

SuperJedi224
sumber
8

Permen , 2 byte

Hn

H adalah singkatan dari Heisen-double

n berarti tidak

'N' dilewatkan dengan flag -i sebagai input numerik. Nilai yang tersisa di tumpukan dicetak saat keluar.

"Bentuk panjang:

rand   # number between 0 and pop()
not    # cast to int, invert non-zero to zero, and zero to one
Dale Johnson
sumber
Saya pikir Anda harus menghitung -isebagai satu byte.
lirtosiast
1
pada dasarnya satu-satunya cara untuk lulus input numerik adalah dengan flag -i. Saya kira hanya bahasa yang membaca dari stdin tidak mengalami penalti spesifikasi input?
Dale Johnson
Nah, jika ada flag input umum, atau Anda hanya menggunakan CLA biasa untuk menyampaikan argumen, itu pasti akan baik-baik saja. Tampaknya tidak adil bahwa tipe data sedang ditentukan secara gratis.
lirtosiast
2
@ThomasKwa Haruskah fungsi yang ditulis dalam bahasa dinamis harus menghitung byte untuk menentukan bahwa argumen adalah bilangan bulat dalam dokumentasi? Dalam lambda x: random.random()<1/x(ungolfed) itu juga "ditentukan secara gratis" bahwa argumennya adalah angka.
user253751
@immibis Hmm, itu poin yang bagus. Saya kira mencoba untuk menjaga aturan untuk program dan fungsi yang sama harus memungkinkan ini, kalau begitu. Saya akan membuat posting di meta.
lirtosiast
7

Serius, 3 byte

,JY

0adalah kepalsuan dan kebenaran 1. Cobalah online

Penjelasan:

,JY
,    get input
 J   push a random integer in range(0, input) ([0, ..., input-1])
  Y  logical not: push 0 if truthy else 1  
Mego
sumber
7

R, 30 22 byte

kode

cat(runif(1)<1/scan())          #new
f=function(N)cat(runif(1)<1/N)  #old

Ini menghasilkan angka dari distribusi seragam (0 ke 1) dan harus mengevaluasi ke true 1 / n kali.

Mutador
sumber
6

Japt, 6 byte

1>U*Mr

Cobalah online!

Mrsetara dengan JS Math.random. Sisanya cukup jelas. Saya mungkin bisa menambahkan fungsi angka yang menghasilkan float acak antara 0 dan angka. Ketika ini terjadi, dua byte akan disimpan:

1>Ur    // Doesn't currently work

Versi alternatif:

1>Ð %U

Ðsetara dengan new Date(, dan objek Tanggal, ketika diminta untuk mengkonversi ke angka, menjadi cap waktu saat ini dalam milidetik. Dengan demikian, ini sepenuhnya acak, kecuali jika dijalankan beberapa kali per ms.

Produksi ETH
sumber
6

Marbelous , 21 byte

}0    # takes one input n
--    # decrements n
??    # random value from range 0..n (inclusive)
=0?0  # push right if not equal to 0, fall through otherwise | convert to zero
++    # increment | no-op
{0//  # output | push left

Saya dianggap 0falsey dan jujur 1, meskipun tidak ada alasan nyata untuk melihat Marbelous tidak benar-benar memiliki if. Lebih banyak Marbelousy akan menjadi output {0untuk benar dan {>salah. Ini akan terlihat seperti ini:

}0
--
??
=0{>
{0

Tapi saya tidak yakin itu valid.

overactor
sumber
Saya siap untuk diskusi meta tentang ini. Versi singkat dari pandangan saya: mengeluarkan nilai ke keluaran berbeda sama dengan memiliki tupel keluaran berbeda dalam bahasa lain. Jika (nil, 1) dan (1, nil) dapat menjadi nilai kebenaran dan kepalsuan Anda dalam bahasa lain, maka {0 vs {> harus diizinkan dalam Marbelous. PS: versi {> Anda tidak akan keluar karena Anda tidak pernah mengisi output lainnya.
Sparr
@Parr itu akan keluar karena tidak aktif, bukan?
overactor
Kamu benar. Saya merasa bodoh.
Sparr
6

APL, 6 3 byte

+=?

Ini adalah kereta fungsi yang mengambil bilangan bulat dan mengembalikan 1 atau 0 (APL benar / salah). Kami menghasilkan integer acak dari 1 ke input menggunakan ?, lalu memeriksa apakah input sama dengan integer itu. Yang menghasilkan peluang 1 / input benar.

Disimpan 3 byte berkat Thomas Kwa!

Alex A.
sumber
@ThomasKwa Saya berpikir tentang semacam kereta, tetapi apakah itu benar-benar dianggap sebagai "fungsi bernama" jika ditugaskan? Saya kira bagian "bernama" melemparkan saya ke sini karena tidak khas.
Alex A.
@ThomasKwa Penugasan kereta (dan fungsi turunan) sepenuhnya paralel dengan semua penugasan lainnya.
Adám
@ NBZ apa yang Anda maksud dengan paralel?
lirtosiast
@ThomasKwa Setara; berperilaku seperti tugas fungsi lainnya.
Adem
Saya akan menggunakan sebagai ganti '+' karena +berarti Conjugate untuk bilangan kompleks. Tentu saja tidak masalah di sini, dan +merupakan fungsi identitas tradisional (tanpa op), tetapi sekarang kita memiliki (sama). No-ops lain untuk skalar adalah: (terwujud), (pilih), (melampirkan), (terbagi), (campuran), (unik), (minta), ,(ravel), (tabel), (terbalik), (terbalik) pertama), dan (transposisi). Beberapa mengubah skalar menjadi vektor atau matriks.
Adám
6

PlatyPar , 3 byte

#?!

#?mendapat nomor acak di [0,n)mana ninput. !kembali truejika nomor sebelum itu 0, kalau tidak kembali false.

Menggunakan fitur yang lebih baru yang diimplementasikan (tapi sayangnya bagi saya tidak berkomitmen) sebelum pertanyaan ini diajukan, saya bisa turun ke 2 dengan ~! Coba online !

Cyoce
sumber
5

Java, 43 byte

boolean b(int a){return a*Math.random()<1;}
SuperJedi224
sumber
1
a->a*Math.random()<1lebih pendek.
TheNumberOne
Harus menentukan "Java 7 atau sebelumnya".
corsiKa
@corsiKlauseHoHoHo Ini juga berfungsi di Java 8
SuperJedi224
1
Tentu saja - tetapi ini bukan golf untuk Java 8, yang akan menggunakan lambdas untuk menghemat ruang. Dengan logika itu, semua jawaban Java juga merupakan jawaban Groovy, tetapi Groovy selalu sama atau lebih kecil karena memiliki pintasan yang tidak dimiliki Java.
corsiKa
5

C, 24 byte

f(n){return!(rand()%n);}
Level River St
sumber
Saya telah memutar kembali edit OP menghapus 4 karakter pertama. Sangat menyenangkan untuk mengurangi byte, tetapi bagi saya, memiliki returntanpa byte f(n)tidak masuk akal secara sintaksis.
Level River St
1
@insertusernamedi sini rand()%nadalah cara standar untuk mendapatkan nomor acak dalam kisaran 0..n-1. Anda benar, memang mengandalkan njauh lebih kecil dari RAND_MAXtetapi tidak ada batas atas untuk ndisebutkan dalam pertanyaan. Pendekatan alternatif adalah dengan melakukan penolakan dan memutar ulang semua nomor dari nke RAND_MAX tetapi akan sangat tidak efisien pada skala kecil n.
Level River St
5

> <>, 27 + 3 untuk -v = 30 byte

Berikut ini adalah solusi yang tidak seragam di mana saya mod N jumlah 15876 pilihan acak 0 atau 1:

0"~":*>:?vr%0=n;
1-$1+$^-1x

N harus menjadi input pada stack dengan -v flag, output adalah 0 untuk falsey dan 1 untuk truey.

Solusi yang jauh lebih cerdas dan seragam yang bekerja untuk 1/2 ^ N sebagai gantinya:

4{:?!v1-}:">"$2p:"x"$3p:"^"$4p1+:">"$3p1+!
   ^1<
0n;
1n;>
 

Untuk input 3, Anda memiliki 1/8 peluang untuk mendapatkan 1 dan 7/8 dari mendapatkan 0.

Penjelasan:

Saya menambahkan sebanyak yang xdiperlukan pada baris ke-4 dan mengelilinginya dengan arah sehingga hanya ada dua jalan keluar x: baik output falsey atau berikutnya x. Jika semua xpergi ke arah yang benar, yang terakhir akan mengarahkan ke output yang benar.

Misalnya untuk N = 5, ruang kode terakhir adalah sebagai berikut:

4{:?!v1-}:">"$2p:"x"$3p:"^"$4p1+:">"$3p1+!
   ^1<
0n; > > > > >
1n;>x>x>x>x>x>
    ^ ^ ^ ^ ^
Harun
sumber
Meskipun benar Anda tidak bisa mendapatkan distribusi yang sempurna untuk N sewenang-wenang, tidak ada orang lain yang menggunakan PRNG. Anda bisa mengulang melalui xa beberapa kali untuk mendapatkan banyak bit acak, merakitnya menjadi int I, kemudian menggunakan I% N sebagai nilai acak Anda.
Sparr
@Sparr mengedit jawaban saya tetapi saya merasa seperti menggunakan sejumlah besar iterasi akan 'rata-rata' bilangan bulat yang dihasilkan, membuat output cenderung ke arah (iterNum/2)%N. Saya tidak berpikir menggunakan angka yang lebih rendah akan menjadi solusi juga. Apakah saya mungkin tidak begitu mengerti Anda, atau apakah Anda punya ide lebih lanjut untuk memperbaiki solusinya?
Aaron
alih-alih menambahkan 15000 bit secara bersamaan, menghasilkan hanya 32 bit dan menggabungkannya, memberikan Anda integer acak 32-bit yang terdistribusi secara merata. mod itu.
Sparr
@Parr yang tampaknya memang lebih baik, bahkan jika saya tidak tahu mengapa;) Itu akan memerlukan biaya lebih banyak byte (> <> payah untuk operasi byte & konversi basis) tetapi saya akan mengubah jawaban saya malam ini (CEST).
Aaron
Anda dapat menggabungkan bit dengan mengalikan dua dan menambahkan: r = 0; untuk (0..32) r = r * 2 + randbit;
Sparr
4

Mathematica, 18 16 byte

#RandomReal[]<1&

Solusi dasar. Yang tidak disebutkan namanya Functionmenciptakan angka acak dalam [0, 1), mengalikannya dengan argumennya, dan memeriksa apakah masih kurang dari 1.

LegionMammal978
sumber
4

Python, 42 byte

import random
lambda n:1>random.random()*n

Sunting : Menghapus time.time()jawaban karena distribusi.

DuhHello
sumber
2
Karena random, ada baiknya dilakukan from random import*untuk menghemat random.. Tapi tidak untuk timesaat itu.
xnor
1
Angka acak yang dihasilkan oleh divisi modulo tidak terdistribusi secara merata .
Trang Oul
@ TrangOul Itu poin bagus; untuk nefek yang lebih besar bisa terlihat. Saya pikir 1>time.time()%1*nbisa bekerja.
lirtosiast
@ TrangOul Saya kira Anda tahu perbedaan antara randdalam C, dan time.timedengan Python ... Salah satu fitur yang jelas dari yang terakhir adalah bahwa ia mengembalikan waktu saat ini , yang tidak terikat, sehingga time.time()%nmemiliki distribusi yang seragam (selama periode waktu yang cukup lama) untuk apa saja n.
user253751
4

TeaScript , 3 byte

!N×

Coba di sini.

Penjelasan

 N  maps to Math.rand which is a utility function that returns an integer
    between `arg1` and `arg2` or `0` and `arg1` if only one argument is
    provided.
  × is expanded to `(x)`, where `x` is initialised with the value provided
    in the input boxes; × represents byte '\xd7'
!   negate the result, 0 results in true, anything else false
Dom Hastings
sumber
1
Bagaimana tujuh karakter menambahkan hingga 6 byte? Dan apakah char (R) a (byte tunggal) ANSI?
Adem
@NBZ, haha! Saya pikir saya berbohong ... Saya menyalahkan mabuk ... Saya akan memperbarui sekarang karena saya akan mengubah mekanisme ke yang lebih mudah yang baru saja saya perhatikan! Dalam versi saat ini yang ®mewakili char '\xae'jadi hanya satu byte. :)
Dom Hastings
4

Fuzzy Octo Guacamole, 10 byte

^-!_[0]1.|

Penjelasan:

^-!_[0]1.|

^          # Get input.
 -         # Decrement, so we can append <ToS> zeros and a 1 to the stack.
  !        # Set loop counter.
   _       # Pop, since we are done with the input.
    [      # Start loop
     0     # Push 0
      ]    # End for loop. We have pushed input-1 0s to the stack.
       1   # Push a single 1 to the stack.
        .  # Switch stacks
         | # Pick a random item from the inactive stack, which has n-1 falsy items and 1 truthy item, so the truthy probability is 1/n.
           # (implicit output)
Rɪᴋᴇʀ
sumber
3

Perl 6 ,  10   8 byte

!(^*).pick
#  ^- The * is the argument

Kode ini menciptakan Rentang dari 0 hingga tetapi tidak termasuk input *. Kemudian picks satu secara acak dan !mengembalikan True ketika menerima a 0.

1>*.rand
# ^- The * is the argument

Ini mengambil input *dan mengalikannya dengan jumlah acak dari 0..^1lalu mengembalikan True jika itu lebih kecil dari 1.

# store it in a lexical code variable for ease of use
my &code = 1>*.rand;

die "never dies here" unless code 1;

for ^8 { say code 4 }
False
True
False
False
False
True
False
False
Brad Gilbert b2gills
sumber
3

Prolog (SWI), 24 byte

Kode:

p(N):-X is 1/N,maybe(X).

mungkin (+ P) adalah fungsi yang berhasil dengan probabilitas P dan gagal dengan probabilitas 1-P

Contoh:

p(4).
false

p(4).
false

p(4).
true
Emigna
sumber
3

PowerShell, 25 Bytes

!(Random -ma($args[0]--))

The Get-RandomFungsi ketika diberi -Maparameter ximum nmengembalikan nilai dari jangkauan [0,n). Kami memanfaatkannya dengan mengurangi 1 dari input kami $args[0], jadi kami benar-benar mengindeks nol, dan mendapatkan nilai acak. Tepatnya 1/nwaktu, nilai ini akan jadi 0, jadi ketika kita Boolean-bukan dengan !itu akan kembali True. Kali lain akan kembali False.

AdmBorkBork
sumber
3

J, 3 byte

0=?

Ini adalah garpu monadik yang mengambil argumen di sebelah kanan. Sama halnya dengan APL,? menghasilkan bilangan bulat acak; Namun, array J berbasis nol. Jadi kami membandingkan dengan 0 bukan dengan input.

lirtosiast
sumber
3

Minkolang 0,14 , 7 byte

1nH1=N.

Coba di sini.

Penjelasan

1          Pushes 1
 n         Takes number from input
  H        Pops b,a and pushes a random integer between a and b, inclusive
   1=      1 if equal to 1, 0 otherwise
     N.    Output as number and stop.
El'endia Starman
sumber
3

PHP, 22 byte

<?=2>rand(1,$argv[1]);

Dibaca ndari baris perintah, seperti:

$ php probability.php 4

Output ( falsedilemparkan ke string kosong di PHP) atau 1(dalam kasus true).

masukkan nama pengguna di sini
sumber
3

C #, 56 45 byte

Terima kasih, pinkfloydx33 sekarang sudah 45 tahun.

bool b(int n){return new Random().Next(n)<1;}

Lama 56 byte

Menghasilkan bilangan bulat positif acak lebih besar atau sama dengan 0 dan lebih kecil dari ndan memeriksa apakah lebih kecil dari 1dan mengembalikan hasil perbandingan.

bool a(int n){Random r=new Random();return r.Next(n)<1;}
ivaan
sumber
1
Selamat datang di PPCG! Sayangnya, pengiriman ini tidak berfungsi, karena Random.Next(k)mengembalikan bilangan bulat ksedemikian rupa 0 <= k < n. Dengan mengubah kondisi menjadi <1, itu akan benar. Selain itu, penggunaan ekspresi lambda dapat membuat kode Anda lebih pendek.
Mego
@Mego Tentu, terima kasih atas komentarnya. Saya membuatnya 0 < k <= ndan itu harus seperti yang Anda katakan. Saya akan segera memperbaikinya.
ivaan
2
Gunakan var rsimpan tiga. Atau jika c # 6, bool a(int n) => new Random().Next(n)<1;untuk 41. Meskipun tidak yakin apakah menginisialisasi Randompanggilan per metode baru akan berfungsi dengan baik sejauh distribusi?
pinkfloydx33
3

Gores , 63 byte

Cobalah online!
Gambar: Kode Scratchblock :
greenflag; tanya; ucapkan <rand (1) ke (answer) = 1>

when gf clicked
ask[]and wait
say<(pick random(1)to(answer))=[1
ev3commander
sumber
2
Eh oh golf saya lebih panjang dari Java D:
ev3commander