Probabilité 1 / N


29

Parce qu'il n'y a pas assez de défis simples de :

Créez un programme ou une fonction éventuellement sans nom qui, étant donné (par tout moyen) un entier 1 ≤ N ≤ 10000, génère la valeur True de votre langue avec une probabilité pseudo-aléatoire de 1 / N, False sinon.

Veuillez noter que l'exigence de dénomination a été supprimée. N'hésitez pas à modifier les réponses et les scores en conséquence.

Certaines langues utilisent 1 (ou -1) et 0 pour Vrai et Faux, c'est bien aussi.

Exemple:

Exemples de tests d'entrée:

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

Ie donné 4; il renvoie Vrai avec 25% de chances et Faux avec 75% de chances.


2
Meta

1
Meta post également pertinent .
AdmBorkBork

Comme toutes les langues n'ont pas construit de "pseudo-aléatoire", est-il possible d'obtenir une graine comme deuxième argument? (Par exemple Brainfuck)
flawr

@flawr utilise la milliseconde actuelle ...
Adám

1
Quel est le plus grand que Nnous devons accepter?
Toby Speight

Réponses:


27

Modèles MediaWiki avec ParserFunctions , 48 octets

{{#ifexpr:1>{{#time:U}} mod {{{n}}}|true|false}}

13
Choix intéressant de langue :-)
Adám

6
Qui diable a pensé qu'il serait judicieux d'ajouter des fonctions non déterministes aux modèles MediaWiki!?
user253751

4
@immibis: eh bien le non-déterminisme se produit à partir #time, probablement pour mettre à jour l'âge des personnes vivantes, etc.
Willem Van Onsem

15

Pyth, 3 octets

!OQ

Essayez-le en ligne

Inversion simple du choix aléatoire de 0 à l'entrée

De manière amusante en Pyth, il n'est pas possible de créer une fonction qui le fasse sans, $car les fonctions Pyth sont automatiquement mémorisées.



@LeakyNun Ah oui, j'avais oublié d'utiliser le temps pour une fonction aléatoire, c'est plutôt intelligent.
FryAmTheEggman

Non, j'ai juste utilisé du temps pour le mémoriser.
Leaky Nun

1
Je suis conscient, je suppose que je ne l'ai pas bien formulé: P Cela dit, je ne pense pas que cela fonctionnerait vraiment comme solution de contournement pour la plupart des soumissions, s'il était jamais meilleur qu'un programme complet pour une raison quelconque. Prendre le temps comme argument n'est probablement pas seulement autorisé par défaut.
FryAmTheEggman

1
@LeakyNun Je crois que cette question est antérieure au Qremplissage à la fin, sinon j'aurais répondu !O;)
FryAmTheEggman

12

CJam, 5 octets

Je dois être rapide avec ceux-ci ...

rimr!

Testez-le ici.

Explication

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
" Je dois être rapide avec ceux-là ... ", ce qui est une raison d'être en désaccord avec OP selon lequel " il n'y a pas assez de défis simples de code-golf ". Si FGITW est un problème, l'OMI c'est trop simple.
Peter Taylor

12

TI-BASIC, 4 octets utilisant des jetons d'un octet

not(int(Ansrand

Détermine si la partie entière de l'entrée multipliée par un nombre aléatoire dans [0,1) est zéro. Ansrand<1fonctionne également.


Comment ... est-ce quatre octets?
John Dvorak

3
@JanDvorak Le premier octet n'est pas (, le suivant est int (, le suivant est Ans, le suivant est rand. En général, les calculatrices graphiques n'utilisent pas ASCII comme représentation interne pour les programmes.)
user253751

@immibis En général, les ordinateurs n'utilisent pas non plus ASCII. Cela pourrait être discutable, y a-t-il une méta-discussion à ce sujet?
Kroltan

7
@Kroltan Oui; c'est la discussion méta, et c'est la liste des jetons qui sont un octet, ce qui comprend les quatre que je.
lirtosiast

@ThomasKwa merci!
Kroltan

11

MATL, 5 octets

Trois versions différentes de celui-ci, toutes de longueur 5.

iYr1=

qui prend une entrée ( i), génère un entier aléatoire entre 1 et ce nombre ( Yr), et voit s'il est égal à 1 ( 1=). Alternativement,

li/r>

faire un 1 ( l, une solution de contournement car il y a un bug avec faire 1ien ce moment), prendre une entrée ( i), diviser pour obtenir 1 / N ( /), faire un nombre aléatoire entre 0 et 1 ( r), et voir si l'aléatoire le nombre est inférieur à 1 / N. Ou,

ir*1<

take et input ( i), et multipliez par un nombre aléatoire entre 0 et 1 ( r*), et voyez si le résultat est inférieur à 1 ( 1<).

Dans Matlab, pas MATL, vous pouvez faire cette fonction anonyme

@(n)n*rand<1

pour 12 octets, qui est utilisé en faisant ans(5), par exemple.


10

JavaScript ES6, 15 octets

-5 octets grâce à Downgoat.

x=>1>new Date%x

Basé sur (utilisations) de la technique de cette réponse.


1
new Datepeut également fonctionner et peut économiser quelques octets
Downgoat

@Downgoat Ah, à droite, date aléatoire!
Conor O'Brien

10

Julia, 17 16 15 octets

n->2>rand(1:n)

Il s'agit d'une fonction qui génère un entier aléatoire compris entre 1 et net teste s'il est inférieur à 2. Il y aura 1 / n chance que cela se produise, et donc 1 / n chance de revenir true.

1 octet enregistré grâce à Thomas Kwa!


9

Microscript II , 3 octets

NR!

Lit un entier n, génère un entier aléatoire entre 0et n-1(inclus), puis applique une négation booléenne à cette valeur.


8

Candy , 2 octets

Hn

H signifie Heisen-double

n signifie pas

Le 'n' est passé avec le drapeau -i comme entrée numérique. Les valeurs laissées sur la pile sont imprimées à la sortie.

"Forme longue:

rand   # number between 0 and pop()
not    # cast to int, invert non-zero to zero, and zero to one

Je pense que vous auriez besoin de compter -icomme un octet.
lirtosiast

1
fondamentalement, la seule façon de passer une entrée numérique est avec le drapeau -i. Je suppose que seules les langues qui lisent depuis stdin ne subissent aucune pénalité de spécification d'entrée?
Dale Johnson

Eh bien, s'il y avait un indicateur d'entrée générique, ou si vous utilisiez simplement des CLA ordinaires pour passer des arguments, ce serait certainement bien. Cependant, il semble injuste que le type de données soit spécifié gratuitement.
lirtosiast

2
@ThomasKwa Une fonction écrite dans un langage dynamique doit-elle compter les octets pour spécifier que l'argument est un entier dans la documentation? Dans lambda x: random.random()<1/x(non golfé), il est également "spécifié gratuitement" que l'argument est un nombre.
user253751

@immibis Hmm, c'est un bon point. Je suppose qu'essayer de garder les mêmes règles pour les programmes et les fonctions devrait permettre cela, alors. Je ferai un post sur meta.
lirtosiast

7

Sérieusement, 3 octets

,JY

0 est falsey et 1 est véridique. Essayez-le en ligne

Explication:

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

code

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

Il génère un nombre à partir d'une distribution uniforme (0 à 1) et devrait être évalué à 1 / n vrai des temps.


6

Japt, 6 octets

1>U*Mr

Essayez-le en ligne!

Mrest équivalent à JS Math.random. Le reste est assez évident. Je pourrais probablement ajouter une fonction numérique qui génère un flottant aléatoire entre 0 et le nombre. Dans ce cas, deux octets seront enregistrés:

1>Ur    // Doesn't currently work

Version alternative:

1>Ð %U

Ðest équivalent à new Date(, et l'objet Date, lorsqu'on lui demande de convertir en nombre, devient l'horodatage actuel en millisecondes. Ainsi, cela est entièrement aléatoire, à moins qu'il ne soit exécuté plusieurs fois par ms.


6

Marbelous , 21 octets

}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

J'ai pris 0pour falsey et 1pour être honnête, bien qu'il n'y ait aucune vraie raison pour que voir Marbelous n'a pas vraiment de si. Plus Marbelousy serait sorti {0pour vrai et {>pour faux. Cela ressemblerait à ceci:

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

Mais je ne suis pas sûr que ce soit valable.


Je serais prêt pour une méta-discussion à ce sujet. Version courte de mon point de vue: la sortie d'une valeur vers une sortie différente équivaut à avoir des tuples de sortie différents dans une autre langue. Si (nil, 1) et (1, nil) peuvent être vos valeurs de vérité et de falsey dans une autre langue, alors {0 vs {> devrait être autorisé à Marbelous. PS: votre version {> ne se fermera pas car vous ne remplissez jamais l'autre sortie.
Sparr

@Sparr, il se fermera en raison de l'inactivité, non?
suracteur

Tu as raison. Je me sens stupide.
Sparr

6

APL, 6 3 octets

+=?

Il s'agit d'un train de fonctions qui prend un entier et renvoie 1 ou 0 (vrai / faux d'APL). Nous générons un entier aléatoire de 1 à l'entrée en utilisant ?, puis vérifions si l'entrée est égale à cet entier. Cela se traduit par une chance 1 / entrée de vrai.

Sauvegardé 3 octets grâce à Thomas Kwa!


@ThomasKwa J'ai pensé à une sorte de train, mais cela compte-t-il vraiment comme une "fonction nommée" s'il est attribué? Je suppose que la partie "nommée" me jette ici car elle est atypique.
Alex A.

@ThomasKwa L'affectation des trains (et des fonctions dérivées) est complètement parallèle à toutes les autres affectations.
Adám

@NBZ qu'entendez-vous par parallèle?
lirtosiast

@ThomasKwa Equivalent; se comporter comme toute autre affectation de fonction.
2015

J'utiliserais au lieu de '+' car +signifie Conjugué pour les nombres complexes. Bien sûr, cela n'a pas d'importance ici, et +c'est la fonction d'identité traditionnelle (no-op), mais maintenant nous avons (la même). Les autres no-ops pour les scalaires sont: (matérialiser), (choisir), (entourer), (fractionner), (mélanger), (unique), (enrôler), ,(ravel), (tableau), (inverser), (inverser d'abord) et (transposer). Certains changent le scalaire en un vecteur ou une matrice.
2015

6

PlatyPar , 3 octets

#?!

#?obtient un nombre aléatoire [0,n)nest entré. !retourne truesi le nombre avant 0, sinon il retourne false.

En utilisant des fonctionnalités plus récentes qui ont été implémentées (mais malheureusement pour moi non engagées) avant que cette question ne soit posée, je peux la réduire à 2 avec ~! Try it online !


5

Java, 43 octets

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

1
a->a*Math.random()<1est plus court.
TheNumberOne

Doit spécifier "Java 7 ou version antérieure".
corsiKa

@corsiKlauseHoHoHo Cela fonctionne aussi bien en Java 8
SuperJedi224

1
Bien sûr que oui - mais ce n'est pas le cas pour Java 8, qui utiliserait des lambdas pour économiser de l'espace. Selon cette logique, toutes les réponses Java sont également des réponses Groovy, mais Groovy est toujours identique ou plus petit car il a des raccourcis que Java n'a pas.
corsiKa

5

C, 24 octets

f(n){return!(rand()%n);}

J'ai annulé l'édition d'OP en supprimant les 4 premiers caractères. C'est agréable d'avoir réduit les octets, mais pour moi, avoir le returnsans le f(n)n'a pas de sens syntaxiquement.
Level River St

1
@insertusernameici rand()%nest un moyen standard d'obtenir un nombre aléatoire dans la plage 0..n-1. Vous avez raison, cela dépend d' nêtre beaucoup plus petit que RAND_MAXmais il n'y a pas de limite supérieure pour nmentionné dans la question. Une autre approche serait de rejeter et de relancer tous les numéros de nRAND_MAX, mais ce serait désespérément inefficace au minimum n.
Level River St

5

> <>, 27 + 3 pour -v = 30 octets

Voici une solution non uniforme du tout où je modifie N la somme de 15876 choix aléatoires de 0 ou 1:

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

N doit être entré sur la pile avec le drapeau -v, la sortie est 0 pour falsey et 1 pour truey.

Une solution beaucoup plus intelligente et uniforme qui fonctionne à la place pour 1/2 ^ N:

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

Pour une entrée 3, vous avez 1/8 de chances d'obtenir 1 et 7/8 d'obtenir 0.

Explication:

J'ajoute autant xque nécessaire sur la 4ème ligne et je les entoure de directions afin qu'il n'y ait que deux voies de sortie x: la sortie falsey ou la suivante x. Je tombex va dans la bonne direction, la dernière route vers la sortie véridique.

Par exemple, pour N = 5, l'espace de code final est le suivant:

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

Bien qu'il soit vrai que vous ne pouvez pas obtenir une distribution parfaite pour N arbitraire, personne d'autre ne peut utiliser un PRNG. Vous pouvez parcourir plusieurs fois un xa pour obtenir un tas de bits aléatoires, les assembler en un int I, puis utiliser I% N comme valeur aléatoire.
Sparr

@Sparr a édité ma réponse, mais j'ai l'impression que l'utilisation d'un grand nombre d'itérations "fera la moyenne" de l'entier résultant, ce qui rendra la sortie fortement orientée (iterNum/2)%N. Je ne pense pas non plus que l'utilisation d'un nombre inférieur soit une solution. Est-ce que je ne vous ai peut-être pas bien compris, ou auriez-vous une autre idée pour améliorer la solution?
Aaron

au lieu d'ajouter 15 000 bits ensemble, ne produisez que 32 bits et concaténez-les, vous donnant un entier aléatoire de 32 bits uniformément distribué. mod que.
Sparr

@Sparr qui semble mieux en effet, même si je ne sais pas pourquoi;) Cela coûtera beaucoup plus d'octets (> <> suce pour les opérations d'octets et la conversion de base) mais je changerai ma réponse ce soir (CEST).
Aaron

vous pouvez concaténer des bits en multipliant par deux et en ajoutant: r = 0; pour (0..32) r = r * 2 + randbit;
Sparr

4

Mathematica, 18 16 octets

#RandomReal[]<1&

Solution basique. L'annulé Functioncrée un nombre aléatoire dans [0, 1), le multiplie par son argument et vérifie s'il est toujours inférieur à 1.


4

Python, 42 octets

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

Edit : Suppression de la time.time()réponse en raison de la distribution.


2
Car random, cela vaut la peine de faire from random import*des économies random.. Pas pour timeautant.
xnor

1
Les nombres aléatoires générés par la division modulo ne sont pas uniformément distribués .
Trang Oul

@TrangOul C'est un bon point; pour un plus grand neffet, l'effet pourrait être perceptible. Je pense que ça 1>time.time()%1*npourrait marcher.
lirtosiast

@TrangOul Je présume que vous connaissez la différence entre randen C et time.timeen Python ... Une caractéristique évidente de ce dernier est qu'il renvoie l'heure actuelle , qui est illimitée, de sorte qu'elle time.time()%na une distribution uniforme (sur des périodes suffisamment longues) pour tout n.
user253751

4

TeaScript , 3 octets

!N×

Essayez-le ici.

Explication

 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
Comment sept caractères ajoutent-ils jusqu'à 6 octets? Et le (R) est-il un (seul octet) caractère ANSI?
2015

@NBZ, haha! Je pense que j'ai menti ... Je blâme la gueule de bois ... Je vais mettre à jour maintenant car je vais changer le mécanisme pour un plus simple que je viens de remarquer! Dans cette version actuelle, le ®représente le caractère '\xae'est donc juste un octet. :)
Dom Hastings

4

Octo Guacamole flou, 10 octets

^-!_[0]1.|

Explication:

^-!_[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 octets

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

Ce code crée une plage de 0 à mais excluant l'entrée *. Il est alors pickun au hasard et !renvoie True lorsqu'il reçoit a 0.

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

Cela prend l'entrée *et la multiplie par un nombre aléatoire, 0..^1puis renvoie True si elle était inférieure à 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 octets

Code:

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

peut-être (+ P) est une fonction qui réussit avec la probabilité P et échoue avec la probabilité 1-P

Exemple:

p(4).
false

p(4).
false

p(4).
true

3

PowerShell, 25 octets

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

La Get-Randomfonction lorsqu'il est administré un -Maparamètre ximum nrenvoie une valeur de la gamme [0,n). Nous tirons parti de cela en soustrayant 1 de notre entrée $args[0], nous sommes donc correctement indexés à zéro et obtenons une valeur aléatoire. Précisément 1/nle temps, cette valeur sera 0, donc quand nous booléen-pas avec !elle reviendra True. Les autres fois reviendront False.


3

J, 3 octets

0=?

Il s'agit d'une fourche monadique qui prend un argument à droite. De même pour APL,? génère un entier aléatoire; cependant, les tableaux J sont basés sur zéro. Nous comparons donc à 0 au lieu de l'entrée.



3

PHP, 22 octets

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

Lit à npartir de la ligne de commande, comme:

$ php probability.php 4

Sorties ( falseest convertie en une chaîne vide en PHP) ou 1(dans le cas de true).


3

C #, 56 45 octets

Merci à pinkfloydx33 c'est 45 maintenant.

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

Ancien 56 octets

Génère un entier positif aléatoire supérieur ou égal à 0 et inférieur à net vérifie s'il est inférieur à 1et renvoie le résultat de la comparaison.

bool a(int n){Random r=new Random();return r.Next(n)<1;}

1
Bienvenue chez PPCG! Malheureusement, cette soumission ne fonctionne pas, car Random.Next(k)renvoie un entier ktel que 0 <= k < n. En changeant la condition en <1, elle sera correcte. De plus, l'utilisation d'une expression lambda peut raccourcir votre code.
Mego

@Mego Bien sûr, merci pour vos commentaires. Je l'ai fait 0 < k <= net ça devrait être comme tu l'as dit. Je vais le corriger immédiatement.
ivaan

2
Utilisez var renregistre trois. Ou si c # 6, bool a(int n) => new Random().Next(n)<1;pour 41. Vous ne savez pas si l'initialisation d'un nouvel Randomappel par méthode fonctionnera correctement en ce qui concerne la distribution?
pinkfloydx33

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.