Prawdopodobieństwo 1 / N

29

Ponieważ nie ma wystarczającej liczby prostych wyzwań związanych z :

Utwórz opcjonalnie nienazwany program lub funkcję, która, podając (w jakikolwiek sposób) liczbę całkowitą 1 ≤ N ≤ 10000, generuje wartość True Twojego języka z pseudolosowym prawdopodobieństwem 1 / N, w przeciwnym razie False.

Pamiętaj, że wymóg nazewnictwa został usunięty. Możesz odpowiednio edytować odpowiedzi i wyniki.

Niektóre języki używają 1 (lub -1) i 0 dla Prawda i Fałsz, to też jest w porządku.

Przykład:

Przykładowe testy wejściowe:

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

Tj. Podano 4; zwraca True z 25% szansą i False z 75% szansą.

Adám
źródło
2
Odpowiedni meta post
FryAmTheEggman,
1
Również odpowiedni meta post .
AdmBorkBork,
Ponieważ nie wszystkie języki mają wbudowaną „pseudolosowość”, czy można uzyskać ziarno jako drugi argument? (Np. Brainfuck)
wada
@flawr użyj bieżącej milisekundy ...
Adám
1
Co największy Nmusimy zaakceptować?
Toby Speight

Odpowiedzi:

27

Szablony MediaWiki z ParserFunctions , 48 bajtów

{{#ifexpr:1>{{#time:U}} mod {{{n}}}|true|false}}
DuhHello
źródło
13
Ciekawy wybór języka :-)
Adám
6
Kto do cholery myślał, że rozsądne byłoby dodanie niedeterministycznych funkcji do szablonów MediaWiki !?
user253751,
4
@immibis: no cóż, z niedeterminizmu wynika #time, prawdopodobnie w celu aktualizacji wieku żywych ludzi itp.
Willem Van Onsem,
15

Pyth, 3 bajty

!OQ

Wypróbuj online

Prosta inwersja losowego wyboru z 0 na wejście

Zabawnie w Pyth nie można stworzyć funkcji, która to robi, $ponieważ funkcje Pyth są automatycznie zapamiętywane.

FryAmTheEggman
źródło
1
To jest możliwe.
Leaky Nun
@LeakyNun Ach, prawda, zapomniałem o użyciu czasu na losową funkcję, to dość sprytne.
FryAmTheEggman
Nie, właśnie wykorzystałem czas, aby go zapamiętać.
Leaky Nun
1
Wiem, myślę, że po prostu nie napisałem tego dobrze: P To powiedziawszy, nie sądzę, że tak naprawdę byłoby to obejście dla większości zgłoszeń, gdyby z jakiegoś powodu było lepsze niż pełny program. Poświęcenie czasu na argument prawdopodobnie nie jest domyślnie dozwolone.
FryAmTheEggman
1
@LeakyNun Myślę, że to pytanie poprzedza Qwypełnienie na końcu, bo inaczej bym odpowiedział !O;)
FryAmTheEggman
12

CJam, 5 bajtów

Muszę być szybki z tymi ...

rimr!

Sprawdź to tutaj.

Wyjaśnienie

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
źródło
11
Muszę być szybki z tymi… ”, co jest powodem, aby nie zgadzać się z OP, że „ nie ma wystarczającej liczby prostych wyzwań związanych z golfem ”. Jeśli FGITW stanowi problem, IMO jest zbyt proste.
Peter Taylor,
12

TI-BASIC, 4 bajty przy użyciu tokena jednobajtowego

not(int(Ansrand

Określa, czy całkowita liczba wejściowa razy liczba losowa w [0,1) wynosi zero. Ansrand<1działa również.

lirtosiast
źródło
Jak ... Czy to cztery bajty?
John Dvorak,
3
@JanDvorak Pierwsze bajty to nie (, następne to int (, następne to Ans, następne to rand.) Ogólnie rzecz biorąc, kalkulatory graficzne nie używają ASCII jako wewnętrznej reprezentacji programów.
user253751
@immibis Zasadniczo komputery również nie używają ASCII. To może być wątpliwe, czy jest na ten temat meta dyskusja?
Kroltan
7
@Kroltan Tak; to jest meta dyskusja, a to lista tokenów, które są jednym bajtem, który obejmuje wszystkie cztery, których użyłem.
lirtosiast
@ThomasKwa dzięki!
Kroltan
11

MATL, 5 bajtów

Trzy różne wersje tego jednego, wszystkie o długości 5.

iYr1=

który pobiera dane wejściowe ( i), generuje losową liczbę całkowitą między 1 a tą liczbą ( Yr) i sprawdza, czy jest ona równa 1 ( 1=). Alternatywnie,

li/r>

wykonaj 1 ( lobejście, ponieważ 1iw tej chwili występuje błąd ), weź dane wejściowe ( i), podziel, aby uzyskać 1 / N ( /), zrób losową liczbę od 0 do 1 ( r) i sprawdź, czy losowa liczba jest mniejsza niż 1 / N. Lub,

ir*1<

weź i wprowadź ( i) i pomnóż przez losową liczbę od 0 do 1 ( r*) i sprawdź, czy wynik jest mniejszy niż 1 ( 1<).

W Matlab, a nie MATL, możesz wykonywać tę anonimową funkcję

@(n)n*rand<1

dla 12 bajtów, które są używane ans(5)np. przez wykonanie .

David
źródło
10

JavaScript ES6, 15 bajtów

-5 bajtów dzięki Downgoat.

x=>1>new Date%x

Na podstawie (zastosowań) techniki tej odpowiedzi.

Conor O'Brien
źródło
1
new Datemoże również działać i może zaoszczędzić kilka bajtów
Downgoat
@Downgoat Ah, racja, Random losowość!
Conor O'Brien,
10

Julia, 17 16 15 bajtów

n->2>rand(1:n)

Jest to funkcja, która generuje losową liczbę całkowitą od 1 do ni sprawdza, czy jest ona mniejsza niż 2. Będzie to miało 1 / n szansę na to, a zatem 1 / n szansę na powrót true.

Oszczędność 1 bajtu dzięki Thomasowi Kwa!

Alex A.
źródło
9

Microscript II , 3 bajty

NR!

Odczytuje liczbę całkowitą n, generuje losową liczbę całkowitą pomiędzy 0i n-1(włącznie), a następnie stosuje do tej wartości negację logiczną.

SuperJedi224
źródło
8

Cukierki , 2 bajty

Hn

H oznacza Heisen-double

n oznacza nie

„N” jest przekazywane z flagą -i jako wejście numeryczne. Wartości pozostawione na stosie są drukowane przy wyjściu.

"Długa forma:

rand   # number between 0 and pop()
not    # cast to int, invert non-zero to zero, and zero to one
Dale Johnson
źródło
Myślę, że powinieneś liczyć się -ijako jeden bajt.
lirtosiast
1
w zasadzie jedynym sposobem na przekazanie danych numerycznych jest użycie flagi -i. Sądzę, że tylko języki, które czytają ze standardowego wejścia, nie są obciążone żadną karą za specyfikację?
Dale Johnson
Cóż, jeśli istnieje ogólna flaga wejściowa lub po prostu używasz zwykłych CLA do przekazywania argumentów, to na pewno byłoby w porządku. Wydaje się jednak niesprawiedliwe, że typ danych jest określany za darmo.
lirtosiast
2
@ThomasKwa Czy funkcja napisana w języku dynamicznym powinna liczyć bajty, aby określić, że argument jest liczbą całkowitą w dokumentacji? W lambda x: random.random()<1/x(nie golfowym) jest również „określone za darmo”, że argument jest liczbą.
user253751,
@immibis Hmm, to dobra uwaga. Myślę, że próba utrzymania tych samych reguł dla programów i funkcji powinna na to pozwolić. Zrobię post na meta.
lirtosiast
7

Poważnie, 3 bajty

,JY

0jest falsey i 1jest prawdą. Wypróbuj online

Wyjaśnienie:

,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
źródło
7

R, 30 22 bajtów

kod

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

Generuje liczbę z równomiernego rozkładu (od 0 do 1) i powinna być obliczona do prawdziwej 1 / n razy.

Mutador
źródło
6

Japt, 6 bajtów

1>U*Mr

Wypróbuj online!

Mrjest odpowiednikiem JS Math.random. Reszta jest dość oczywista. Prawdopodobnie mógłbym dodać funkcję liczbową, która generuje losowe liczby zmiennoprzecinkowe między 0 a liczbą. Kiedy tak się stanie, zostaną zapisane dwa bajty:

1>Ur    // Doesn't currently work

Alternatywna wersja:

1>Ð %U

Ðjest równoważne new Date(, a obiekt Date, gdy zostanie poproszony o konwersję na liczbę, staje się bieżącym znacznikiem czasu w milisekundach. Jest to więc całkowicie losowe, chyba że jest uruchamiane wiele razy na ms.

ETHprodukcje
źródło
6

Cudowny , 21 bajtów

}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

Uznałem, że jestem 0falseyem i 1prawdę, chociaż nie ma prawdziwego powodu, aby widzieć, że Marbelous tak naprawdę nie ma „if”. Więcej Marbelousy zostanie wydane na {0rzecz prawdy i {>fałszu. Wyglądałoby to tak:

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

Ale nie jestem pewien, czy to ważne.

overactor
źródło
Byłbym gotowy na meta dyskusję na ten temat. Krótka wersja mojego widoku: wyprowadzanie wartości do innego wyjścia jest równoważne z posiadaniem różnych krotek wyjścia w innym języku. Jeśli (zero, 1) i (1, zero) mogą być twoimi prawdomównymi i falsey wartościami w innym języku, wtedy {0 vs {> powinno być dozwolone w Marbelous. PS: Twoja wersja {> nie chce wyjść, ponieważ nigdy nie wypełniasz innych danych wyjściowych.
Sparr,
@Sparr wyjdzie z powodu braku aktywności, nie?
overactor
Masz rację. Czuję się głupio.
Sparr,
6

APL, 6 3 bajty

+=?

Jest to ciąg funkcji, który przyjmuje liczbę całkowitą i zwraca 1 lub 0 (prawda / fałsz APL). Generujemy losową liczbę całkowitą od 1 do wejścia za pomocą ?, a następnie sprawdzamy, czy wejście jest równe tej liczbie całkowitej. Daje to szansę na prawdziwość 1 / wejście.

Zaoszczędź 3 bajty dzięki Thomasowi Kwa!

Alex A.
źródło
@ThomasKwa Myślałem o jakimś pociągu, ale czy to naprawdę liczy się jako „nazwana funkcja”, jeśli zostanie przypisana? Wydaje mi się, że część „nazwana” mnie tu rzuca, ponieważ jest nietypowa.
Alex A.,
@ThomasKwa Przydział pociągów (i funkcje pochodne) jest całkowicie równoległy do ​​wszystkich innych zadań.
Adám
@NBZ co rozumiesz przez określenie równoległe?
lirtosiast
@ThomasKwa Equivalent; zachowuje się jak każde inne przypisanie funkcji.
Adám
Użyłbym zamiast „+”, ponieważ +oznacza Koniugat dla liczb zespolonych. Oczywiście nie ma to tutaj znaczenia i +jest to tradycyjna funkcja tożsamości (no-op), ale teraz mamy (to samo). Inne brak operacji dla skalarów to: (materializacja), (pick), (załącz), (split), (mix), (unikalny), (enlist), ,(ravel), (table), (reverse), (reverse) najpierw) i (transponuj). Niektóre zmieniają skalar na wektor lub macierz.
Adám
6

PlatyPar , 3 bajty

#?!

#?pobiera losową liczbę, w [0,n)której njest wprowadzany. !zwraca, truejeśli poprzednia liczba 0, w przeciwnym razie zwraca false.

Używając nowszych funkcji, które zostały zaimplementowane (ale niestety dla mnie nie popełniono), zanim zadano to pytanie, mogę obniżyć do 2 dzięki ~! Wypróbuj online !

Cyoce
źródło
5

Java, 43 bajty

boolean b(int a){return a*Math.random()<1;}
SuperJedi224
źródło
1
a->a*Math.random()<1jest krótszy.
TheNumberOne
Należy podać „Java 7 lub wcześniejsza”.
corsiKa
@corsiKlauseHoHoHo Działa to również w Javie 8
SuperJedi224,
1
Oczywiście, że tak - ale nie jest to gra w golfa dla Javy 8, która wykorzystywałaby lambdy do oszczędzania miejsca. Zgodnie z tą logiką wszystkie odpowiedzi Java są również odpowiedziami Groovy, ale Groovy jest zawsze taki sam lub mniejszy, ponieważ ma skróty, których Java nie ma.
corsiKa
5

C, 24 bajty

f(n){return!(rand()%n);}
Level River St
źródło
Cofnąłem edycję OP usuwając pierwsze 4 znaki. Fajnie jest zmniejszyć bajty, ale dla mnie posiadanie „ returnbez” f(n)nie ma żadnego sensu składniowego.
Level River St
1
@ nazwa_serwera rand()%njest standardowym sposobem uzyskiwania losowej liczby z zakresu 0..n-1. Masz rację, polega on na ntym , że jest znacznie mniejszy niż, RAND_MAXale nie ma górnej granicy dla nwymienionych w pytaniu. Alternatywnym podejściem byłoby odrzucić i nprzerzucić wszystkie liczby od do RAND_MAX, ale byłoby to beznadziejnie nieefektywne przy małych n.
Level River St
5

> <>, 27 + 3 dla -v = 30 bajtów

Oto niejednolite rozwiązanie, w którym modyfikuję N sumę 15876 losowych wyborów 0 lub 1:

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

N musi być wprowadzone na stos z flagą -v, wyjście to 0 dla falsey i 1 dla prawdy.

O wiele inteligentniejsze i jednolite rozwiązanie, które zamiast tego działa dla 1/2 N:

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

Dla wejścia 3 masz 1/8 szans na uzyskanie 1 i 7/8 na uzyskanie 0.

Objaśnienie:

Dołączam tyle, xile potrzeba na czwartej linii i xotaczam je kierunkami, więc są tylko dwa wyjścia : albo falsey, albo następny x. Jeśli wszystko xpójdzie we właściwym kierunku, ostatni doprowadzi do prawdziwego wyniku.

Na przykład dla N = 5 końcowa przestrzeń kodowa jest następująca:

4{:?!v1-}:">"$2p:"x"$3p:"^"$4p1+:">"$3p1+!
   ^1<
0n; > > > > >
1n;>x>x>x>x>x>
    ^ ^ ^ ^ ^
Aaron
źródło
Chociaż prawdą jest, że nie można uzyskać idealnej dystrybucji dla dowolnego N, to nikt inny nie może używać PRNG. Możesz kilka razy przejść przez xa, aby uzyskać kilka losowych bitów, złożyć je w liczbę I, a następnie użyć I% N jako wartości losowej.
Sparr,
@Sparr zredagował moją odpowiedź, ale mam wrażenie, że użycie dużej liczby iteracji „uśredni” wynikową liczbę całkowitą, powodując, że dane wyjściowe będą miały tendencję do (iterNum/2)%N. Nie sądzę też, aby użycie mniejszej liczby było rozwiązaniem. Czy może nie do końca cię zrozumiałem, czy może masz jakiś pomysł na lepsze rozwiązanie?
Aaron,
zamiast dodawać 15 000 bitów razem, produkuj tylko 32 bity i łącz je, dając ci równomiernie rozłożoną 32-bitową liczbę całkowitą. mod that.
Sparr,
@Sparr, który wydaje się rzeczywiście lepszy, nawet jeśli nie mam pojęcia, dlaczego;) To będzie kosztować znacznie więcej bajtów (> <> jest do bani dla operacji na bajtach i konwersji bazy), ale dziś wieczorem zmienię odpowiedź (CEST).
Aaron,
możesz łączyć bity, mnożąc je przez dwa i dodając: r = 0; dla (0..32) r = r * 2 + randbit;
Sparr
4

Mathematica, 18 16 bajtów

#RandomReal[]<1&

Podstawowe rozwiązanie. Bezimienna Functiontworzy losową liczbę w [0, 1), mnoży ją przez argument i sprawdza, czy wciąż jest mniejsza niż 1.

LegionMammal978
źródło
4

Python, 42 bajty

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

Edycja : Usunięto time.time()odpowiedź z powodu dystrybucji.

DuhHello
źródło
2
Bo randomwarto from random import*oszczędzać random.. timeAle nie na pewno.
xnor
1
Liczby losowe generowane przez podział modulo nierównomiernie rozmieszczone .
Trang Oul,
@TrangOul To dobra uwaga; dla większych nefekt może być zauważalny. Myślę, że 1>time.time()%1*nmoże działać.
lirtosiast
@TrangOul Zakładam, że znasz różnicę między randC i time.timePythonem ... Jedną oczywistą cechą tego ostatniego jest to, że zwraca on bieżący czas , który jest nieograniczony, dzięki czemu time.time()%nma jednolity rozkład (przez wystarczająco długi okres czasu) dla każdego n.
user253751,
4

TeaScript , 3 bajty

!N×

Wypróbuj tutaj.

Wyjaśnienie

 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
źródło
1
W jaki sposób siedem znaków dodaje do 6 bajtów? I czy (R) jest (jednobajtowym) znakiem ANSI?
Adám,
@NBZ, haha! Myślę, że skłamałem ... Obwiniam kaca ... Zaktualizuję teraz, gdy zamierzam zmienić mechanizm na prostszy, który właśnie zauważyłem! W obecnej wersji ®znak reprezentuje znak, '\xae'więc jest to tylko jeden bajt. :)
Dom Hastings,
4

Rozmyte Octo Guacamole, 10 bajtów

^-!_[0]1.|

Wyjaśnienie:

^-!_[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ɪᴋᴇʀ
źródło
3

Perl 6 ,  10   8 bajtów

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

Ten kod tworzy zakres od 0 do zera, ale z wyłączeniem danych wejściowych *. Następnie pickjest losowy i !zwraca True, gdy otrzyma 0.

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

To pobiera dane wejściowe *i mnoży je przez losową wartość Num, 0..^1a następnie zwraca wartość True, jeśli była mniejsza niż 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
źródło
3

Prolog (SWI), 24 bajty

Kod:

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

może (+ P) jest funkcją, która kończy się prawdopodobieństwem P, a kończy się niepowodzeniem z prawdopodobieństwem 1-P

Przykład:

p(4).
false

p(4).
false

p(4).
true
Emigna
źródło
3

PowerShell, 25 bajtów

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

Get-RandomFunkcja gdy otrzymuje -Maparametr ximum nzwraca wartość z zakresu [0,n). Wykorzystujemy to, odejmując 1 od naszych danych wejściowych $args[0], więc jesteśmy właściwie indeksowani do zera i otrzymujemy losową wartość. Dokładnie 1/nw tym czasie ta wartość będzie 0, więc kiedy my Boolean, nie razem z !nią wróci True. Inne czasy powrócą False.

AdmBorkBork
źródło
3

J, 3 bajty

0=?

To monadyczny widelec, który bierze argument po prawej stronie. Podobnie jak APL? generuje losową liczbę całkowitą; jednak tablice J są zerowane. Porównujemy więc do 0 zamiast do wejścia.

lirtosiast
źródło
3

Minkolang 0,14 , 7 bajtów

1nH1=N.

Wypróbuj tutaj.

Wyjaśnienie

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
źródło
3

PHP, 22 bajty

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

Czyta nz wiersza poleceń, na przykład:

$ php probability.php 4

Dane wyjściowe ( falsejest rzutowany na pusty ciąg w PHP) lub 1(w przypadku true).

wstawić nazwę tutaj
źródło
3

C #, 56 45 bajtów

Dzięki pinkfloydx33 jest teraz 45.

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

Stare 56 bajtów

Generuje losową liczbę całkowitą dodatnią większą lub równą 0 i mniejszą niż ni sprawdza, czy jest mniejsza 1i zwraca wynik porównania.

bool a(int n){Random r=new Random();return r.Next(n)<1;}
Ivaan
źródło
1
Witamy w PPCG! Niestety to przesłanie nie działa, ponieważ Random.Next(k)zwraca taką liczbę całkowitą k, że 0 <= k < n. Zmiana warunku na <1będzie poprawna. Ponadto użycie wyrażenia lambda może skrócić Twój kod.
Mego
@Mego Pewnie, dziękuję za komentarz. Zrobiłem to 0 < k <= ni powinno być tak, jak powiedziałeś. Zaraz to poprawię.
Ivan
2
Użyj var rzapisuje trzy. Lub jeśli c # 6, bool a(int n) => new Random().Next(n)<1;dla 41. Chociaż nie jesteś pewien, czy inicjowanie nowego Randomwywołania metody będzie działało poprawnie w zakresie dystrybucji?
pinkfloydx33