1 / N Wahrscheinlichkeit

29

Weil es nicht genug einfache Herausforderungen gibt:

Erstellen Sie ein optionales unbenanntes Programm oder eine Funktion, die (mit allen Mitteln) eine Ganzzahl von 1 ≤ N ≤ 10000 angibt und den wahren Wert Ihrer Sprache mit einer pseudozufälligen Wahrscheinlichkeit von 1 / N ausgibt, andernfalls False.

Bitte beachten Sie, dass die Anforderung zur Benennung entfernt wurde. Fühlen Sie sich frei, die Antworten und Ergebnisse entsprechend zu bearbeiten.

Einige Sprachen verwenden 1 (oder -1) und 0 für Wahr und Falsch, das ist auch in Ordnung.

Beispiel:

Beispiel für Eingabetests:

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

Dh gegeben 4; Es gibt True mit einer Chance von 25% und False mit einer Chance von 75% zurück.

Adam
quelle
2
Relevanter
Metapost
1
Auch relevanter Metapost .
AdmBorkBork
Da nicht alle Sprachen "Pseudozufälligkeit" eingebaut haben, ist es möglich, einen Keim als zweites Argument zu erhalten? (ZB Brainfuck)
Fehler
@flawr aktuelle Millisekunde verwenden ...
Adám
1
Was ist das größte, das Nwir akzeptieren müssen?
Toby Speight

Antworten:

27

MediaWiki-Vorlagen mit ParserFunctions , 48 Bytes

{{#ifexpr:1>{{#time:U}} mod {{{n}}}|true|false}}
DuhHello
quelle
13
Interessante Wahl der Sprache :-)
Adám
6
Wer zum Teufel hielt es für sinnvoll, MediaWiki-Vorlagen nicht deterministische Funktionen hinzuzufügen?
user253751
4
@immibis: Nun, der Nicht-Determinismus tritt auf #time, wahrscheinlich um das Alter der lebenden Menschen usw. zu aktualisieren.
Willem Van Onsem
15

Pyth, 3 Bytes

!OQ

Probieren Sie es online aus

Einfache Umkehrung der Zufallsauswahl von 0 zu Eingabe

Amüsanterweise ist es in Pyth nicht möglich, eine Funktion zu $erstellen, ohne die dies möglich ist, da Pyth-Funktionen automatisch gespeichert werden.

FryAmTheEggman
quelle
1
Es ist möglich.
Undichte Nonne
@LeakyNun Ah richtig, ich hatte vergessen, die Zeit für eine Zufallsfunktion zu verwenden, das ist ziemlich clever.
FryAmTheEggman
Nein, ich habe nur die Zeit genutzt, um es auswendig zu lernen.
Undichte Nonne
1
Mir ist bewusst, dass ich es einfach nicht gut formuliert habe: P Das heißt, ich denke nicht, dass es für die meisten Einreichungen wirklich als Workaround funktionieren würde, wenn es aus irgendeinem Grund jemals besser als ein vollständiges Programm wäre. Die Zeit als Argument zu nehmen ist wahrscheinlich nicht nur standardmäßig erlaubt.
FryAmTheEggman
1
@LeakyNun Ich glaube, diese Frage geht dem QAusfüllen am Ende !O
voraus
12

CJam, 5 Bytes

Muss schnell mit diesen sein ...

rimr!

Teste es hier.

Erläuterung

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
quelle
11
" Muss schnell mit diesen sein ... ", was ein Grund ist, mit OP nicht übereinzustimmen, dass " es nicht genug einfache Code-Golf- Herausforderungen gibt ". Wenn FGITW ein Problem ist, ist es IMO zu einfach.
Peter Taylor
12

TI-BASIC, 4 Bytes mit 1-Byte-Token

not(int(Ansrand

Bestimmt, ob der ganzzahlige Teil der Eingabe mit einer Zufallszahl in [0,1] Null ist. Ansrand<1funktioniert auch.

Lirtosiast
quelle
Wie ... Sind das vier Bytes?
John Dvorak
3
@JanDvorak Das erste Byte ist nicht (, das nächste ist int (, das nächste ist Ans, das nächste ist rand. Im Allgemeinen verwenden Grafikrechner kein ASCII als interne Darstellung für Programme.
user253751
@immibis Im Allgemeinen verwenden Computer auch kein ASCII. Das könnte fraglich sein, gibt es eine Metadiskussion darüber?
Kroltan
7
@Kroltan Ja; Dies ist die Metadiskussion, und dies ist die Liste der Token, die ein Byte umfassen, einschließlich aller vier, die ich verwendet habe.
Lirtosiast
@ ThomasKwa danke!
Kroltan
11

MATL, 5 Bytes

Drei verschiedene Versionen von dieser, alle Länge 5.

iYr1=

Dieser Befehl nimmt eine Eingabe ( i), generiert eine zufällige Ganzzahl zwischen 1 und dieser Zahl ( Yr) und prüft, ob sie gleich 1 ( 1=) ist. Alternative,

li/r>

Machen Sie eine 1 ( leine Umgehung, weil es einen Fehler gibt, der gerade zu tun hat 1i), nehmen Sie eine Eingabe ( i), dividieren Sie, um 1 / N ( /) zu erhalten, machen Sie eine Zufallszahl zwischen 0 und 1 ( r) und prüfen Sie, ob die Zufallszahl vorliegt Anzahl ist kleiner als 1 / N. Oder,

ir*1<

nimm und gib ( i) ein und multipliziere mit einer Zufallszahl zwischen 0 und 1 ( r*) und sieh nach, ob das Ergebnis kleiner als 1 ( 1<) ist.

In Matlab und nicht in MATL können Sie diese anonyme Funktion ausführen

@(n)n*rand<1

für 12 Bytes, die ans(5)zum Beispiel verwendet wird.

David
quelle
10

JavaScript ES6, 15 Byte

-5 Bytes dank Downgoat.

x=>1>new Date%x

Basierend auf der Technik dieser Antwort.

Conor O'Brien
quelle
1
new Datekann auch funktionieren und könnte ein paar Bytes sparen
Downgoat
@ Downgoat Ah, richtig, Datum Zufälligkeit!
Conor O'Brien
10

Julia, 17 16 15 Bytes

n->2>rand(1:n)

Dies ist eine Funktion, die eine zufällige Ganzzahl zwischen 1 und erzeugt nund prüft, ob sie kleiner als 2 ist. Es besteht eine 1 / n-Chance, dass dies geschieht, und somit eine 1 / n-Chance, dass sie zurückkehrt true.

1 Byte gespart dank Thomas Kwa!

Alex A.
quelle
9

Mikroskript II , 3 Bytes

NR!

Liest eine Ganzzahl n, generiert eine zufällige Ganzzahl zwischen 0und n-1(einschließlich) und wendet dann eine boolesche Negation auf diesen Wert an.

SuperJedi224
quelle
8

Süßigkeit , 2 Bytes

Hn

H steht für Heisen-Doppel

n steht für nicht

Das 'n' wird mit dem Flag -i als numerische Eingabe übergeben. Auf dem Stapel verbleibende Werte werden beim Beenden gedruckt.

"Lange Form:

rand   # number between 0 and pop()
not    # cast to int, invert non-zero to zero, and zero to one
Dale Johnson
quelle
Ich denke, Sie müssten -ials ein Byte zählen.
Lirtosiast
1
Im Grunde ist die einzige Möglichkeit, numerische Eingaben zu übergeben, das Flag -i. Ich vermute, nur Sprachen, die von stdin lesen, erleiden keine Einbußen bei den Eingabespezifikationen.
Dale Johnson
Wenn es ein generisches Eingabe-Flag gäbe oder Sie nur reguläre CLAs zur Übergabe von Argumenten verwenden würden, wäre das definitiv in Ordnung. Es erscheint jedoch unfair, dass der Datentyp kostenlos angegeben wird.
Lirtosiast
2
@ThomasKwa Muss eine in einer dynamischen Sprache geschriebene Funktion die Bytes zählen, um anzugeben, dass das Argument eine Ganzzahl in der Dokumentation ist? In lambda x: random.random()<1/x(ungolfed) wird außerdem "kostenlos angegeben", dass das Argument eine Zahl ist.
user253751
@immibis Hmm, das ist ein guter Punkt. Ich denke, der Versuch, die Regeln für Programme und Funktionen gleich zu halten, sollte dies dann erlauben. Ich werde einen Beitrag auf Meta machen.
Lirtosiast
7

Im Ernst, 3 Bytes

,JY

0ist falsch und 1ist wahr. Probieren Sie es online aus

Erläuterung:

,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
quelle
7

R 30 22 Bytes

Code

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

Sie generiert eine Zahl aus einer Gleichverteilung (0 bis 1) und sollte zu 1 / n der Zeiten als wahr ausgewertet werden.

Mutador
quelle
6

Japt, 6 Bytes

1>U*Mr

Probieren Sie es online!

Mrist gleichbedeutend mit JS Math.random. Der Rest ist ziemlich offensichtlich. Ich könnte wahrscheinlich eine Zahlenfunktion hinzufügen, die einen zufälligen Gleitkommawert zwischen 0 und der Zahl erzeugt. In diesem Fall werden zwei Bytes gespeichert:

1>Ur    // Doesn't currently work

Alternative Version:

1>Ð %U

Ðist äquivalent zu new Date(und das Date-Objekt wird beim Umwandeln in eine Zahl zum aktuellen Zeitstempel in Millisekunden. Dies ist also völlig zufällig, es sei denn, es wird mehrmals pro ms ausgeführt.

ETHproductions
quelle
6

Marbelous , 21 Bytes

}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

Ich habe angenommen 0, falsch zu sein und ehrlich 1zu sein, obwohl es keinen wirklichen Grund dafür gibt, da Marbelous nicht wirklich ein Wenn hat. Mehr Marbelousy würde {0für wahr und {>falsch ausgegeben werden . Das würde so aussehen:

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

Aber ich bin mir nicht sicher, ob das gültig ist.

Überakteur
quelle
Ich würde gerne eine Metadiskussion darüber führen. Kurzfassung meiner Ansicht: Die Ausgabe eines Werts an eine andere Ausgabe entspricht der Ausgabe von verschiedenen Ausgabetupeln in einer anderen Sprache. Wenn (nil, 1) und (1, nil) Ihre Wahrheits- und Falschheitswerte in einer anderen Sprache sein können, sollte {0 vs {> in Marbelous zulässig sein. PS: Ihre {> -Version wird nicht beendet, da Sie die andere Ausgabe nie füllen.
Sparr
@Sparr wird es wegen Inaktivität verlassen, nein?
Overactor
Du hast recht. Ich fühle mich dumm.
Sparr
6

APL, 6 3 Bytes

+=?

Dies ist ein Funktionszug, der eine Ganzzahl annimmt und 1 oder 0 zurückgibt (APLs true / false). Wir generieren eine zufällige Ganzzahl von 1 bis zur Eingabe mit ?und prüfen dann, ob die Eingabe dieser Ganzzahl entspricht. Das ergibt eine 1 / Eingabe-Chance von wahr.

3 Bytes gespart dank Thomas Kwa!

Alex A.
quelle
@ThomasKwa Ich habe über eine Art Zug nachgedacht, aber zählt das wirklich als "benannte Funktion", wenn es zugewiesen wird? Ich schätze, der "benannte" Teil wirft mich hierher, da er untypisch ist.
Alex A.
@ThomasKwa Die Zuordnung von Zügen (und abgeleiteten Funktionen) erfolgt vollständig parallel zu allen anderen Zuordnungen.
Adám,
@NBZ was meinst du mit parallel?
Lirtosiast
@ ThomasKwa Äquivalent; Verhalten wie bei jeder anderen Funktionszuweisung.
Adám
Ich würde anstelle von '+' verwenden, weil +das Konjugieren für komplexe Zahlen bedeutet. Natürlich spielt es hier keine Rolle und +ist die traditionelle Identitätsfunktion (no-op), aber jetzt haben wir (dasselbe). Andere No-Ops für Skalare sind: (materialisieren), (auswählen), (einschließen), (teilen), (mischen), (einzigartig), (eintragen), ,(ravel), ( tabelle ), (umkehren), (umkehren) zuerst) und (transponieren). Einige verwandeln den Skalar in einen Vektor oder eine Matrix.
Adám
6

PlatyPar , 3 Bytes

#?!

#?Ruft eine Zufallszahl ab, [0,n)in ndie eingegeben wird. !Gibt zurück, truewenn die Zahl davor ist 0, sonst wird zurückgegeben false.

Mit neueren Funktionen, die implementiert wurden (aber leider für mich nicht verbindlich), bevor diese Frage gestellt wurde, kann ich sie mit ~! Try it online auf 2 reduzieren !

Cyoce
quelle
5

Java, 43 Bytes

boolean b(int a){return a*Math.random()<1;}
SuperJedi224
quelle
1
a->a*Math.random()<1ist kürzer.
TheNumberOne
Sollte "Java 7 oder früher" angeben.
corsiKa
@corsiKlauseHoHoHo Dies funktioniert jedoch auch in Java 8
SuperJedi224
1
Natürlich ist es das - aber es ist nicht für Java 8 geeignet, das Lambdas verwenden würde, um Platz zu sparen. Nach dieser Logik sind alle Java-Antworten auch Groovy-Antworten, aber Groovy ist immer gleich oder kleiner, da es Verknüpfungen gibt, die Java nicht hat.
corsiKa
5

C 24 Bytes

f(n){return!(rand()%n);}
Level River St
quelle
Ich habe die Bearbeitung von OP zurückgesetzt und die ersten 4 Zeichen entfernt. Es ist schön, Bytes zu reduzieren, aber für mich macht es syntaktisch keinen Sinn , das returnohne zu haben f(n).
Level River St
1
@insertusernamehere rand()%nist eine Standardmethode, um eine Zufallszahl in den Bereich zu bekommen 0..n-1. Sie haben Recht, es kommt darauf an n, viel kleiner zu sein als, RAND_MAXaber es gibt keine Obergrenze für ndie in der Frage genannten. Ein alternativer Ansatz wäre, alle Zahlen von nRAND_MAX abzulehnen und erneut zu würfeln, aber im Kleinen wäre dies hoffnungslos ineffizient n.
Level River St
5

> <>, 27 + 3 für -v = 30 Byte

Hier ist eine uneinheitliche Lösung, bei der ich N als Summe von 15876 zufälligen Picks von 0 oder 1 modifiziere:

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

N muss auf dem Stack mit dem Flag -v eingegeben werden, die Ausgabe ist 0 für Falsey und 1 für Truthy.

Eine viel intelligentere und einheitlichere Lösung, die stattdessen für 1/2 ^ N funktioniert:

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

Für einen Eingang 3 haben Sie 1/8 Chancen auf 1 und 7/8 auf 0.

Erklärung:

Ich füge xin der 4. Zeile so viel wie nötig hinzu und xumgebe sie mit Anweisungen, sodass es nur zwei Möglichkeiten gibt : entweder die Falsey-Ausgabe oder die nächste x. Wenn alle xin die richtige Richtung gehen, wird der letzte Weg zum wahren Ausgang führen.

Für N = 5 lautet der endgültige Codespace beispielsweise wie folgt:

4{:?!v1-}:">"$2p:"x"$3p:"^"$4p1+:">"$3p1+!
   ^1<
0n; > > > > >
1n;>x>x>x>x>x>
    ^ ^ ^ ^ ^
Aaron
quelle
Es ist zwar wahr, dass Sie keine perfekte Verteilung für beliebiges N erhalten können, aber auch niemand anderes, der ein PRNG verwendet. Sie können ein x einige Male durchlaufen, um eine Reihe von Zufallsbits zu erhalten, diese zu einem int I zusammenzusetzen und dann I% N als Ihren Zufallswert zu verwenden.
Sparr
@Sparr hat meine Antwort bearbeitet, aber ich habe das Gefühl, dass durch die Verwendung einer großen Anzahl von Iterationen die resultierende Ganzzahl "herausgemittelt" wird, sodass die Ausgabe stark dazu tendiert (iterNum/2)%N. Ich denke nicht, dass die Verwendung einer niedrigeren Nummer eine Lösung wäre. Habe ich Sie vielleicht nicht ganz verstanden, oder hätten Sie noch eine Idee, um die Lösung zu verbessern?
Aaron
Anstatt 15000 Bits zu addieren, erstellen Sie nur 32 Bits und verknüpfen Sie diese, um eine gleichmäßig verteilte 32-Bit-Zufallszahl zu erhalten. mod das.
Sparr
@Sparr das scheint in der Tat besser zu sein, auch wenn ich keine Ahnung habe warum;) Das kostet viel mehr Bytes (> <> saugt für Byteoperationen und Basiskonvertierung), aber ich werde meine Antwort heute Abend (MESZ) ändern.
Aaron
Sie können Bits verketten, indem Sie mit zwei multiplizieren und Folgendes hinzufügen: r = 0; für (0..32) r = r * 2 + Randbit;
Sparr
4

Mathematica, 18 16 Bytes

#RandomReal[]<1&

Grundlösung. Der Unbenannte Functionerzeugt eine Zufallszahl in [0, 1], multipliziert sie mit ihrem Argument und prüft, ob sie noch kleiner als 1 ist.

LegionMammal978
quelle
4

Python, 42 Bytes

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

Bearbeiten : Die time.time()Antwort wurde aufgrund der Verteilung entfernt.

DuhHello
quelle
2
Denn randomes lohnt sich from random import*zu sparen random.. Nicht für timeobwohl.
xnor
1
Durch Modulo-Division erzeugte Zufallszahlen sind nicht gleichmäßig verteilt .
Trang Oul
@TrangOul Das ist ein guter Punkt; für größere könnte nder Effekt spürbar sein. Ich denke 1>time.time()%1*nkönnte funktionieren.
Lirtosiast
@TrangOul Ich nehme an, Sie kennen den Unterschied zwischen randC und time.timePython ... Ein offensichtliches Merkmal des letzteren ist, dass es die aktuelle Zeit zurückgibt , die unbegrenzt ist, so dass time.time()%neine gleichmäßige Verteilung vorliegt (über lange genug Zeiträume). für jeden n.
user253751
4

TeaScript , 3 Bytes

!N×

Probieren Sie es hier aus.

Erläuterung

 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
quelle
1
Wie addieren sich sieben Zeichen zu 6 Bytes? Und ist das (R) ein (Einzelbyte-) ANSI-Zeichen?
Adám
@NBZ, haha! Ich glaube, ich habe gelogen ... Ich beschuldige den Kater ... Ich werde es jetzt aktualisieren, da ich den Mechanismus auf einen einfacheren ändere, den ich gerade bemerkt habe! In dieser aktuellen Version ®repräsentiert das Zeichen '\xae'nur ein Byte. :)
Dom Hastings
4

Fuzzy Octo Guacamole, 10 Bytes

^-!_[0]1.|

Erläuterung:

^-!_[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ɪᴋᴇʀ
quelle
3

Perl 6 ,  10   8 Bytes

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

Dieser Code erstellt einen Bereich von 0 bis einschließlich der Eingabe *. Es ist dann pickeine zufällige und die !gibt True zurück, wenn es eine empfängt 0.

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

Dies nimmt die Eingabe *und multipliziert sie mit einer zufälligen Zahl. 0..^1Wenn sie kleiner als ist, wird True zurückgegeben 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
quelle
3

Prolog (SWI), 24 Bytes

Code:

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

Vielleicht ist (+ P) eine Funktion, die mit der Wahrscheinlichkeit P erfolgreich ist und mit der Wahrscheinlichkeit 1-P fehlschlägt

Beispiel:

p(4).
false

p(4).
false

p(4).
true
Emigna
quelle
3

PowerShell, 25 Bytes

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

Die Get-RandomFunktion gibt bei Angabe eines -Maximum-Parameters neinen Wert aus dem Bereich zurück [0,n). Wir nutzen dies, indem $args[0]wir 1 von unserer Eingabe subtrahieren , sodass wir den Index korrekt auf Null setzen und einen zufälligen Wert erhalten. Genau 1/nzu dieser Zeit wird dieser Wert sein 0, wenn wir also Boolesche Werte - nicht mit !ihm - zurückgeben True. Die anderen Zeiten werden wiederkommen False.

AdmBorkBork
quelle
3

J, 3 Bytes

0=?

Dies ist eine monadische Gabel, die ein Argument auf der rechten Seite übernimmt. Ähnlich wie bei APL? generiert eine zufällige ganze Zahl; J-Arrays sind jedoch nullbasiert. Also vergleichen wir mit 0 anstatt mit der Eingabe.

Lirtosiast
quelle
3

Minkolang 0,14 , 7 Bytes

1nH1=N.

Probieren Sie es hier aus.

Erläuterung

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
quelle
3

PHP, 22 Bytes

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

Liest nvon der Kommandozeile, wie:

$ php probability.php 4

Ausgaben ( falsewird in PHP in eine leere Zeichenkette umgewandelt) oder 1(im Falle von true).

insertusernamehere
quelle
3

C #, 56 45 Bytes

Dank pinkfloydx33 sind es jetzt 45.

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

Alte 56 Bytes

Erzeugt eine zufällige positive Ganzzahl, die größer oder gleich 0 und kleiner als ist, nund überprüft, ob sie kleiner als ist, 1und gibt das Vergleichsergebnis zurück.

bool a(int n){Random r=new Random();return r.Next(n)<1;}
ivaan
quelle
1
Willkommen bei PPCG! Leider funktioniert diese Übermittlung nicht, da Random.Next(k)eine Ganzzahl kwie folgt zurückgegeben wird 0 <= k < n. Wenn Sie die Bedingung in ändern <1, ist dies korrekt. Darüber hinaus kann die Verwendung eines Lambda-Ausdrucks Ihren Code kürzer machen.
Mego
@ Mego Sicher, danke für den Kommentar. Ich habe es geschafft 0 < k <= nund es sollte so sein, wie du gesagt hast. Ich werde es sofort korrigieren.
ivaan
2
Gebrauch var rspart drei. Oder wenn c # 6 bool a(int n) => new Random().Next(n)<1;für 41. Sie sind sich nicht sicher, ob die Initialisierung eines neuen RandomMethodenaufrufs für die Verteilung ordnungsgemäß funktioniert?
pinkfloydx33