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.




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

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.



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

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.


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.


10

JavaScript ES6, 15 Byte

-5 Bytes dank Downgoat.

x=>1>new Date%x

Basierend auf der Technik dieser Antwort.


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!


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.


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

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  

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.


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.


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.


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!


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


5

Java, 43 Bytes

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

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

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

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.


4

Python, 42 Bytes

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

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


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

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)

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

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

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.


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.



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


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

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.