«I» a «i» une chance de se produire


10

Concevez un générateur de nombres aléatoires où le i ème nombre a i% de chance de se produire pour tous 0 <i <14. 0 devrait avoir exactement 9% de chance de se produire. La graine pour le générateur doit être l'heure du système. Vous ne pouvez pas utiliser une fonction prédéfinie pour la génération de nombres aléatoires.

Fondamentalement, 1 a 1% de chance de se produire, 2 a 2% de chance et ainsi de suite jusqu'à 13 ayant 13% de chance de se produire. C'est le code-golf, donc le code le plus court l'emporte.


7
Et les 9% de chances supplémentaires?
LegionMammal978

@ LegionMammal978 je l'ai déjà spécifié. Il devrait
afficher

Oui, ça va maintenant. Quel était le problème plus tôt?
ghosts_in_the_code

@ghosts_in_the_code Le <de l'inégalité et le >du bloc de devis formaient une balise HTML.
Martin Ender

2
Une résolution en secondes est-elle OK?
xnor

Réponses:


13

CJam, 14 octets

E,_T9t\]ze~es=

Testez-le ici.

Explication

E,   e# Push [0 1 2 ... 12 13].
_    e# Make a copy.
T9t\ e# Set the first element to 9. Swap with the original range.
]z   e# Wrap them in an array and transpose to get [[9 0] [1 1] [2 2] ... [13 13].
e~   e# Run-length decode to get `[0 0 0 0 0 0 0 0 0 1 2 2 3 3 3 ... 13 13 ... 13 13].
es=  e# Use the current timestamp as a cyclic index into this array.

Umm, pourquoi pas mR?
Optimizer

1
@Optimizer "La valeur de départ pour le générateur doit être l'heure système. Vous ne pouvez pas utiliser une fonction prédéfinie pour la génération de nombres aléatoires."
Martin Ender

Ah, j'ai raté cette partie.
Optimizer

7

Python 2, 54

import time
print((time.time()*1e4%800+1)**.5+1)//2%14

L'expression f(t) = ((8*t+1)**.5+1)//2transforme une distribution uniforme en une distribution entière triangulaire en mappant les intervalles

[0,1)  --> 1
[1,3)  --> 2
[3,6)  --> 3
[6,10) --> 4
...

Nous convertissons les millisecondes du temps en un flottant uniforme de 0 à 100 en faisant time.time()*1e4%100. En fait, nous faisons %800pour remplacer la multiplication par 8 dans l'étape de conversion. À la fin, 14 sont convertis en 0 en faisant %14.



4

Dyalog APL , 20 octets

⊃(⌊.1×⊃⌽⎕TS)↓(/⍨⍳13)

⍳13entiers 1 à 13
(/⍨)répliquer par lui-même, par exemple /⍨3est 3 3 3et /⍨2 3est 2 2 3 3 3
n … supprimer n éléments (laisse la liste vide si n > longueur de la liste)
⎕TShorodatage du système par exemple 2015 11 1 13 28 56 834
⊃⌽dernier élément, c.-à-d. milliseconde actuelle 0–999
⌊.1×multiplier avec 0,1 et arrondir le
premier élément, donne 0 si si les données sont vides


3

Traitement 3, 65 55 74 octets

long i=0,c=8,r=System.nanoTime()%100;for(;r>c;i++,c+=i);print(i);

Obtenez un nombre aléatoire de 0 à 99 (inclus). Si le nombre est 0-8, imprimer 0, si c'est 9 imprimer 1, si 10-11 imprimer 2, si 12-14 imprimer 3, etc ...

Personne ne l'a remarqué, mais le problème avec l'ancien code est que millis () renvoie la durée pendant laquelle l'application a été exécutée, ce qui donnerait des nombres très similaires lors des exécutions ultérieures du programme. Au moins maintenant, nous avons une nano précision!


2

PHP, 50 octets

<?for($t=microtime()*100;0<=$t-=++$i;)?><?=$i%14;
  • microtimerenvoie l'heure sous la forme d'une chaîne comme "0,04993000 1446409253", lorsque je multiplie cela par 100, PHP contraint la chaîne à 0,04993000, résultat 4,993000. $tEst donc initialisé avec un nombre "aléatoire" dans[0,100)
  • On soustrait 1, 2, 3, ... de $tjusqu'à ce qu'il atteigne 0
  • Le résultat est le dernier nombre soustrait, modulo 14

Vous pouvez réellement écrire ;echoau lieu de ?><?=, pour le même nombre d'octets. Mais bien fait!
Ismael Miguel

1

Python3, 86 octets

simple:

import time;print(sum([[i]*i for i in range(1,14)],[0]*9)[int(str(time.time())[-2:])])

1

J - 28 caractères

Celui-ci était idiot.

{:({:1e3*6!:0'')$100{.#~i.14

6!:0''est l' Y M D h m sheure actuelle sous la forme d'une liste de 6 éléments, où les millisecondes sont représentées sous forme de fractions sur les secondes - pour les atteindre, nous n'avons d'autre choix que de multiplier les secondes ( {:) par 1e3. Pendant ce temps, #~i.14est une liste de zéro 0, un 1, deux 2, et ainsi de suite jusqu'à treize 13, et nous complétons cela à 100 éléments 100{..

J n'a pas d'indexation cyclique, il peut donc être tentant de prendre les millisecondes modulo 100 avant d'indexer la grande liste. Cependant, nous pouvons enregistrer deux caractères en utilisant $à la place pour étendre cycliquement la liste de 100 éléments au nombre de millisecondes que nous obtenons (de 0 à 60999 ) et prendre la dernière entrée à ce moment-là.

Pas qu'une liste d'éléments 60000 soit beaucoup de mémoire utilisée ou quoi que ce soit, cela ressemble à une surpuissance: P


1

JavaScript (ES6) 116

Ceci est une adaptation d'un RNG semé simple que j'ai utilisé à la place du RNG standard de javascript qui ne peut pas être semé (et qui n'est donc pas répétable)

R=(s=~new Date,p=[],i=0,j=9)=>{
while(p.push(i)<100)--j?0:j=++i;
return _=>(s=(1+Math.sin(s))*1e5,p[100*(s-~~s)|0])
};

// test

var rnd=R()

t=[0,0,0,0,0,0,0,0,0,0,0,0,0,0];
rgb='000,444,666,888,aaa,ddd,f0f,ff0,0ff,0ff,0f0,00f,f00,fff'.split`,`
.map(v=>(v=parseInt(v,16),[(v&15)*17,(v>>4&15)*17,(v>>8)*17]))

cnt=400*300
//for (i=0;i<cnt;i++)t[rnd()]++;

ctx = C.getContext("2d");
img=ctx.getImageData(0, 0, 400, 300)
for(p=0,y=0;y<300;y++)for(x=0;x<400;x++)
  v=rnd(),t[v]++,
  img.data[p++]=rgb[v][0],img.data[p++]=rgb[v][1],
  img.data[p++]=rgb[v][2],img.data[p++]=255
ctx.putImageData(img, 0, 0)

o=''
for(i=0;i<14;i++)
  t[i]/=cnt, o+=`<p><i>${i}</i><b style="width:${t[i]*300}%">,</b>${(t[i]*100).toFixed(2)}%</p>`;
G.innerHTML=o
#G { width: 400px; font-size: 12px; border: 1px solid #000;  }
p { margin: 0}
b { display: inline-block; font-size:80%; background: #08c; margin: 2px }
i { display: inline-block; width: 20px; text-align: right; padding: 0 4px }
#C { width: 400px; height: 300px; }
<div id=G></div>
<canvas id=C></canvas>


J'aime vraiment la façon dont vous prouvez que la valeur retournée est vraiment proche des exigences. Bien fait! +10 sur cette toile!
Ismael Miguel

0

TI-BASIC, 18 octets

real(int(.5+2√(-4+50fPart(sub(getTime

100fPart(sub(getTimeobtient le résidu aléatoire entre 0 et 99. Le (n-1) ème nombre triangulaire est égal à (N^2+N)/2, donc l'inverse est égal à √(2y+1)-.5. Plancher ceci après un ajustement à la baisse de 9, et nous avons le résultat

Le seul problème est que pour les résidus inférieurs à 8, nous obtenons une racine carrée imaginaire. Nous prenons donc la partie réelle pour avoir la sortie de programme 0 à la place.


0

Perl 5, 51 octets

50 octets + 1 pour -Eau lieu de -e:

@_=(0)x 9;push@_,($_)x$_ for 0..13;say$_[time%100]
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.