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




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

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.



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

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


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 .


10

JavaScript ES6, 15 bajtów

-5 bajtów dzięki Downgoat.

x=>1>new Date%x

Na podstawie (zastosowań) techniki tej odpowiedzi.


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!


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


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

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  

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.


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.


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.


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!


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


5

Java, 43 bajty

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

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

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

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.


4

Python, 42 bajty

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

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


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

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)

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

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

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.


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.



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


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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.