Komputery nie znikąd tworzą losowe liczby bez podstawy, ponieważ najprawdopodobniej czas jest uniwersalną podstawą losowości.
Chcę, abyś utworzył kod, który tworzy losowe liczby według następujących reguł:
- Czas nie może być podstawą w żadnym momencie programu.
- Wstępnie zdefiniowane funkcje losowe / pseudolosowe są niedozwolone.
- Wygenerowane liczby mogą znajdować się w dowolnym zakresie. Co najmniej dwie różne liczby całkowite: D
- Numery są powtarzane.
popularity-contest
Dadan
źródło
źródło
Odpowiedzi:
JavaScript
To było zabawne!
Napisałem Twister Mersenne w JS. Potem zdałem sobie sprawę, że muszę gdzieś zdobyć ziarno.
Zdecydowałem, że dostanę go z interfejsu API wymiany stosów! (Mógłbym użyć
localStorage
i zwiększyć licznik, ale to nie jest zabawne.) Więc złapałem 10 ostatnio aktywnych odpowiedzi, a następnie po prostu wziąłem co 4 lub mniej kolejnych cyfr w odpowiedzi i dodałem je.Te nasiona są zawsze różne, ponieważ Przepełnienie stosu stale się aktualizuje (a mój limit wciąż maleje!) Liczby obejmują identyfikatory odpowiedzi, identyfikatory pytań, wyniki, liczby w górę / w dół głosów, dane właściciela / identyfikatory oraz dane opakowania (limit i inne) ). Na jednym biegu dostałem
256845
wtedy270495
, a potem256048
itd.To rejestruje 10 losowych 32-bitowych liczb uzupełniających dwa do konsoli. Przykładowe dane wyjściowe:
źródło
Jawa
Magia jest w
public NoTimeRandom()
. Tablice rzutowane na ciągi mogą mylić nowych programistów, ponieważ liczby są losowe. Próbkę (zachar[]
:[C@4a8e91eb
).next
Metoda jest kopiowany zjava.util.Random
.Przykładowe dane wyjściowe:
Przetestujmy skuteczność tego rng:
W mojej odpowiedzi na aproksymację krzywej dzwonienia generowane przeze mnie dane zależą od dobrego rng. Uruchommy to z tym jako rng. Wynik:
Dokładnie jak myślałem. To jest dość kiepski rng.
źródło
do
Skompiluj z flagą -pthread (lub cokolwiek, czego używa Twój kompilator).
Nie jestem pewien, czy to się kwalifikuje, czy też nie w oparciu o standard „czas nie jest dozwolony”, ponieważ w zasadzie używa on harmonogramu jako źródła entropii, celowo ignorując bezpieczeństwo wątków. Działa przy użyciu dość podstawowej funkcji losowo-losowej ( generator liczb losowych Lehmera ) z początkowo zakodowanym początkowo ziarnem. Następnie rozpoczyna 20 wątków, w których wszystkie uruchamiają obliczenia Lehmera ze wspólnym zestawem zmiennych.
Wygląda na to, że działa całkiem dobrze, oto kilka kolejnych przebiegów:
EDYCJA: Zastanów się trochę i zdaj sobie sprawę, że to wcale nie jest czas. Nawet przy całkowicie deterministycznym harmonogramie entropia nie pochodzi z przedziałów czasowych - pochodzi z ładowania wszystkich uruchomionych procesów w systemie.
EDYCJA 2 Po zainspirowaniu się @Quincunx po opublikowaniu krzywej dzwonowej, zrzuciłem 12 MB losowości do pliku i przesłałem ją do CAcert . Nie przeszedł wszystkich trudnych testów, ale osiągnął szacunek 7.999573 z 8 w teście ENT (tylko potencjalnie deterministyczny). Co ciekawe, podwojenie liczby wątków pogorszyło sytuację.
źródło
do
Generuje losową liczbę z zakresu 0-255, pobierając ziarno z https://stackoverflow.com/questions używając
wget
.Przykładowy przebieg:
źródło
C ++
wynik
dowolne 5 liczb losowych
trzy próbki
źródło
11230576, 0, 11206992, 0, 2053725299
, które wciąż nie wydają mi się przypadkowe.perl
Co to za śmiecie z pozyskiwania nasion przez Internet? Brzmi dla mnie jak oszustwo ;-) Wolę zamiast tego dać swoje ziarno kryptograficznej funkcji skrótu i dać wynik w zakresie od 0 do 2 ^ 160-1, tak jak:
Za każdym razem, gdy masz entropię o niepewnej jakości, sposobem na jej regularniejsze rozpowszechnianie (ale nie zwiększanie jej jakości!) Jest podłączenie jej do SHA1 lub MD5 lub mniej więcej, tak jak to zrobiłem tutaj. W przypadku nasion przed hash użyłem pid i adresu losowego odniesienia. Możesz oczywiście dodać inne dane wejściowe dla większej entropii, np. Na x86 możesz użyć TSC - (ale wstawianie kodu asemblera w perlu to trochę niedźwiedź, więc go pominąłem).
Jeśli chcesz mieć inne wyjście niż facet na następnym komputerze, po prostu dostosuj „some_salt”, aby był ciągiem swoich upodobań. Lub całkowicie pomiń, jeśli jesteś minimalistą =)
źródło
Jawa
Moje rozwiązanie narusza
hashCode()
metodęObject
klasy.Przykładowe dane wyjściowe:
Zmotywowany inną odpowiedzią pokazującą losowość rozwiązania, zmieniłem swoje rozwiązanie, aby zwrócić środkowe 16 bitów
int
zwróconego przezObject.hashCode()
.Wygenerowałem plik 19 MB (składający się z 10 7
short
) i przesłałem go do CACert . Oto zrzut ekranu wyniku (został zredagowany, aby wyglądać ładnie, ale liczby pozostały bez zmian ):Byłem zaskoczony wynikiem, ponieważ w teście Entropii taktuje 7,999991 i zdaje (?) Wszystkie 7 testów Dieharda.
źródło
JavaScript
Generowanie losowe za pomocą ruchu myszy użytkownika
Ostatnie pięć skopiowanych danych:
9637090187003
7828470680762
6045869361238
4220720695015
2422653391073
źródło
Bash, zakres: ints od 0 do 1
źródło
echo -n & echo $!
zrobi, ale będzie bardzo złym RNG. Możesz także zmienić 2 na dowolną inną liczbę, ale im większa liczba, tym gorsza jest „losowość”.Rubin
Niestety tylko Mac. Używamy
sox
do wyciągania bajtów z mikrofonu (jako ciąg, ahem ...), odwracania go, aby uzyskać nagłówek stanu na końcu (* kaszel *), pocięcia go, odcięcia nagłówka, weź MD5 kawałków , porzuć znaki nienumeryczne z mieszania, dodaj pozostałe duże liczby całkowite razem, przyklej0.
z przodu, zamień na zmiennoprzecinkowe, gotowe.Generuje liczby zmiennoprzecinkowe w przedziale
0..1
.źródło
do
Generowanie losowe przy użyciu identyfikatora procesu.
Przykładowe dane wyjściowe:
źródło
OBRACAĆ
Jeśli tak było golf-golfwygrałbym!
źródło
pyton
Zwięzłość Pythona nigdy nie przestaje zadziwiać. Ponieważ użycie losowego obrazu imgur najwyraźniej nie jest poprawne, skorzystałem z doskonałego źródła losowości: czata stackoverflow!
5 prób:
Niezupełnie losowy, ale z drugiej strony żaden z nich nie jest.
źródło
whatever.com/random
perl
Widziałem wiele odpowiedzi, które wysyłały żądania HTTP, co wydaje mi się marnotrawstwem, ponieważ pod okładkami są przekazywane losowe liczby na drucie. Postanowiłem więc napisać kod, aby przesunąć jeden na niższym poziomie:
Teoretycznie podaje losowe porty z zakresu 0..65535. W praktyce istnieje wiele portów, których nigdy nie zobaczysz, więc dystrybucja nie jest idealna. Ale to AFAICT to minimalna ilość pracy, którą możesz zrobić, aby uzyskać entropię ze zdalnego hosta, który ma otwarty port.
PS - Obsługa błędów pozostawia czytelnikowi ćwiczenie ;-)
źródło
do
źródło