„I” ma szansę „i” wystąpić


10

Zaprojektuj generator liczb losowych, w którym i-ta liczba ma szansę wystąpienia i% dla wszystkich 0 <i <14. 0 powinno mieć dokładnie 9% prawdopodobieństwa wystąpienia. Ziarno generatora powinno być czasem systemowym. Nie można użyć wstępnie zdefiniowanej funkcji do generowania liczb losowych.

Zasadniczo 1 ma 1% szansy na wystąpienie, 2 ma 2% szansy i tak dalej aż do 13 z 13% szansą na wystąpienie. To jest golf golfowy, więc wygrywa najkrótszy kod.


7
A co z pozostałymi 9% szansami?
LegionMammal978

@ LegionMammal978 Już określiłem. Powinien wypisać 0.
ghosts_in_the_code

Tak, teraz jest w porządku. Jaki był wcześniej problem?
ghosts_in_the_code

@ghosts_in_the_code Od <nierówności i >od bloku cytatu tworzyli znacznik HTML.
Martin Ender

2
Czy rozdzielczość sekund jest OK?
xnor

Odpowiedzi:


13

CJam, 14 bajtów

E,_T9t\]ze~es=

Sprawdź to tutaj.

Wyjaśnienie

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, czemu nie mR?
Optymalizator

1
@Optimizer „Ziarno generatora powinno być czasem systemowym. Nie można użyć wstępnie zdefiniowanej funkcji do generowania liczb losowych.”
Martin Ender,

Ach, tęskniłem za tą częścią.
Optymalizator

7

Python 2, 54

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

Wyrażenie f(t) = ((8*t+1)**.5+1)//2przekształca rozkład równomierny w rozkład liczb całkowitych trójkątnych poprzez odwzorowanie przedziałów

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

W ten sposób konwertujemy milisekundowe cyfry czasu do jednolitej liczby zmiennoprzecinkowej od 0 do 100 time.time()*1e4%100. W rzeczywistości %800w kroku konwersji robimy zamianę mnożenia przez 8. Na koniec 14 jest konwertowane na 0 przez wykonanie %14.



4

Dyalog APL , 20 bajtów

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

⍳13liczby całkowite 1 choć 13
(/⍨)powielają się same, np. /⍨3jest 3 3 3i /⍨2 3jest 2 2 3 3 3
n … upuść n elementów (pozostawia pustą listę, jeśli n > długość listy)
⎕TSznacznik czasu systemowego np. 2015 11 1 13 28 56 834
⊃⌽ostatni element, tj. bieżąca milisekunda 0–999
⌊.1×pomnożyć z 0,1 i zaokrąglenie
pierwszego elementu, daje 0, jeśli dane są puste


3

Przetwarzanie 3, 65 55 74 bajtów

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

Uzyskaj losową liczbę od 0 do 99 (włącznie). Jeśli liczba to 0-8, wydrukuj 0, jeśli jest to 9 wydruk 1, jeśli 10-11 wydruk 2, jeśli 12-14 wydruk 3, itd ...

Nikt tego nie zauważył, ale problem ze starym kodem polega na tym, że millis () zwraca czas działania aplikacji, co dałoby bardzo podobne liczby przy kolejnych uruchomieniach programu. Przynajmniej teraz mamy nano precyzję!


2

PHP, 50 bajtów

<?for($t=microtime()*100;0<=$t-=++$i;)?><?=$i%14;
  • microtimezwraca czas jako ciąg znaków taki jak „0.04993000 1446409253”, kiedy pomnożę to przez 100, PHP wymusza ciąg do 0.04993000, wynik 4.993000. Więc $tjest inicjowany z „random” numer w[0,100)
  • Odejmujemy 1, 2, 3, ... od, $taż osiągnie 0
  • Wynikiem jest ostatnia odejmowana liczba, modulo 14

Możesz pisać ;echozamiast tego ?><?=, dla tej samej liczby bajtów. Ale ładnie zrobione!
Ismael Miguel

1

Python3, 86 bajtów

bezpośredni:

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

1

J - 28 znaków

Ten był głupi.

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

6!:0''to aktualny Y M D h m sczas w postaci 6-elementowej listy, w której milisekundy są przedstawiane jako ułamki sekund - aby się do nich dostać, nie mamy innego wyboru, jak pomnożyć sekundy ( {:) przez 1e3. Tymczasem #~i.14jest lista zer 0, jeden 1, dwa 2 itd. Aż do trzynastu 13, a my uzupełniamy to do 100 pozycji za pomocą 100{..

J nie ma cyklicznego indeksowania, więc może być kuszące, aby wziąć milisekundy modulo 100 przed zindeksowaniem dużej listy. Możemy jednak zapisać dwa znaki, korzystając $z cyklicznego rozszerzania listy 100 elementów do dowolnej liczby milisekund, którą otrzymujemy (od 0 do 60999 ), a następnie weźmy ostatni wpis.

Nie chodzi o to, że lista 60000 elementów zajmuje dużo pamięci lub coś w tym rodzaju, po prostu wydaje się, że to przesada: P


1

JavaScript (ES6) 116

Jest to adaptacja prostego rozstawionego RNG, którego użyłem zamiast standardowego RNG javascript, którego nie można rozstawić (a więc nie można go powtórzyć)

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>


Naprawdę podoba mi się to, jak udowodniłeś, że zwracana wartość jest naprawdę zbliżona do wymagań. Ładnie wykonane! +10 na tym płótnie!
Ismael Miguel

0

TI-BASIC, 18 bajtów

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

100fPart(sub(getTimeotrzymuje losową resztę od 0 do 99. (n-1) th liczba trójkątna jest równa (N^2+N)/2, więc odwrotność jest równa √(2y+1)-.5. Piętro to po zmniejszeniu o 9, a my mamy wynik

Jedynym problemem jest to, że dla reszt mniejszych niż 8 otrzymujemy wyimaginowany pierwiastek kwadratowy. Więc bierzemy prawdziwą rolę, aby zamiast tego program miał wyjście 0.


0

Perl 5, 51 bajtów

50 bajtów + 1 dla -Ezamiast -e:

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