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%.




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

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.



@ 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.

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.


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.


10

JavaScript ES6, 15 byte

-5 byte berkat Downgoat.

x=>1>new Date%x

Berdasarkan off (penggunaan) dari ini teknik jawaban ini.


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!


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.


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

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  

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.


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.


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.


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!


@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 !


5

Java, 43 byte

boolean b(int a){return a*Math.random()<1;}

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

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

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.


4

Python, 42 byte

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

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


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

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)

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

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

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.


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.



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


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

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.