iso randomi

Anonyymi

Mikähän olis kätevin tapa generoida satunnaisluku unsigned long long- tyyppiseen muuttujaan? Kääntäjän mukana tuleva rand() kun ei osaa kuin int-tyyppisen luvun arpomaan.

4

591

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Anonyymi

      Kuinka monta bittiä "int" ja "unsigned long long" ovat sinulla?

      Jos ovat yhtä monta bittiä, niin sitten vaan cast int:sta toiseen tyyppiin. Jos int on vaikka puolet pienempi niin sitten generoi kaksi int:iä ja yhdistä ne yhdeksi suuremmaksi luvuksi tyyliin (a << int_bittimäärä) | b

    • Anonyymi

      Generoi satunnainen double 0 ja 1 väliltä ja sitten kerrot luvun kokonaislukutyypin maksimilla.

      • Anonyymi

        Hmm.. ei välttämättä toimi. Joissakin arkkitehtuureissa double on muistaakseni 48 bittiä sisäisessä esitysmuodossa ja tästä ei 64 bittistä entropiaa revitä. Tekisin oman rand64-tyypin ja unionin. rand-funktiolle c-standardi takaa muistaakseni 15 bittiä entropiaa minimissään, joten kyllä siinä ihan tosissaan bittiä saa nyplätä jos haluaa geneerisen ratkaisun. Alla jotain mietteitä toteutuksesta:

        #include<stdio.h>
        #include<stdlib.h>

        typedef unsigned long long rand_type;

        typedef struct rand_t {
        union {
        rand_type big_rand;
        char rnd[sizeof(rand_type)];
        };
        } Rand;

        int main(void)
        {
        Rand num;
        for(int i=0; i < sizeof(Rand); i )
        {
        num.rnd[i] = rand(...) % 0xff;
        }
        printf("big_rand: %llu (RANDMAX=%llu)\n", num.big_rand, RAND_MAX);
        return 0;
        }
        Näkee hyvin, ettei geneerinen ja nopea koodi aina kulje käsi kädessä. Tätä en käyttäisi juuri missään..


      • Anonyymi
        Anonyymi kirjoitti:

        Hmm.. ei välttämättä toimi. Joissakin arkkitehtuureissa double on muistaakseni 48 bittiä sisäisessä esitysmuodossa ja tästä ei 64 bittistä entropiaa revitä. Tekisin oman rand64-tyypin ja unionin. rand-funktiolle c-standardi takaa muistaakseni 15 bittiä entropiaa minimissään, joten kyllä siinä ihan tosissaan bittiä saa nyplätä jos haluaa geneerisen ratkaisun. Alla jotain mietteitä toteutuksesta:

        #include<stdio.h>
        #include<stdlib.h>

        typedef unsigned long long rand_type;

        typedef struct rand_t {
        union {
        rand_type big_rand;
        char rnd[sizeof(rand_type)];
        };
        } Rand;

        int main(void)
        {
        Rand num;
        for(int i=0; i < sizeof(Rand); i )
        {
        num.rnd[i] = rand(...) % 0xff;
        }
        printf("big_rand: %llu (RANDMAX=%llu)\n", num.big_rand, RAND_MAX);
        return 0;
        }
        Näkee hyvin, ettei geneerinen ja nopea koodi aina kulje käsi kädessä. Tätä en käyttäisi juuri missään..

        Olet oikeassa double-tyypin entropiasta. Yleensä rand-standardifunktiota koskee sama rajoitus hieman toisessa muodossa eli koodisi todennäköisesti antaa jollakin syklillä toistuvia "satunnaisnumeroita". Standardifunktio on usein toteutettu yksinkertaisella PRNG-algoritmilla, jossa siemenluku on esimerkiksi 32-bittinen.

        https://en.wikipedia.org/wiki/Pseudorandom_number_generator

        Suosittelisin tähän jotakin omaa PRNG-toteutusta, jossa siemenluvussa on bittejä ainakin kaksi kertaa se määrä mitä unsigned long long -tyypissä. Algoritmi on yksinkertainen, vain kerto- ja yhteenlasku isoilla kokonaisluvuilla aiheuttavat pientä päänvaivaa. Testaamista unohtamatta.


    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Mielessäni vieläkin T

      Harmi että siinä kävi niinkuin kävi, rakastin sinua. Toivotan sulle kaikkea hyvää. Toivottavasti löydät sopivan ja hyvän
      Ikävä
      39
      1641
    2. Nellietä Emmaa ja Amandaa stressaa

      Ukkii minnuu Emmaa ja Amandaa stressaa ihan sikana joten voidaanko me koko kolmikko hypätä ukin kainaloon ja syleilyyn k
      Isovanhempien jutut
      6
      1341
    3. Ei luottoa lakko maahan

      Patria menetti sovitun ksupan.
      Suomen Keskusta
      9
      1299
    4. Nähtäiskö ylihuomenna taas siellä missä viimeksikin?

      Otetaan ruokaöljyä, banaaneita ja tuorekurkkuja sinne messiin. Tehdään taas sitä meidän salakivaa.
      Ikävä
      1
      1295
    5. Pupuhuhdasta löytyi lähes sadan kilon miljoonalasti huumeita

      Pupuhuhdasta löytyi lähes sadan kilon miljoonalasti huumeita – neljä Jyväskylän Outlaws MC:n jäsentä vangittu: "Määrät p
      Jyväskylä
      42
      1287
    6. Persut petti kannattajansa, totaalisesti !

      Peraujen fundamentalisteille, vaihtkaa saittia. Muille, näin sen näimme. On helppo luvata kehareille, eikä ne ymmärrä,
      Maailman menoa
      4
      1263
    7. Sinäkö se olit...

      Vai olitko? Jostain kumman syystä katse venyi.. Ajelin sitten miten sattuu ja sanoin ääneen siinä se nyt meni😅😅... Lis
      Ikävä
      0
      1244
    8. Housuvaippojen käyttö Suomi vs Ulkomaat

      Suomessa housuvaippoja aletaan käyttämään vauvoilla heti, kun ne alkavat ryömiä. Tuntuu, että ulkomailla housuvaippoihin
      Vaipat
      1
      1220
    9. Hyvää yötä ja kauniita unia!

      Täytyy alkaa taas nukkumaan, että jaksaa taas tämän päivän haasteet. Aikainen tipu madon löytää, vai miten se ärsyttävä
      Tunteet
      2
      1180
    10. Lepakot ja lepakkopönttö

      Ajattelin tehdä lepakkopöntön. Tietääkö joku ovatko lepakot talvella lepakkopöntössä ´vai jossain muualla nukkumassa ta
      1
      1156
    Aihe