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.
iso randomi
Anonyymi
4785
0Äänestä
Muut lukivat myös
Odottaa vastausta
Näihin keskusteluihin ei ole vielä vastattu. Ole ensimmäinen.
Vastaukset 4
Vanhimmat
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
Generoi satunnainen double 0 ja 1 väliltä ja sitten kerrot luvun kokonaislukutyypin maksimilla.
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.