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
4
695
Vastaukset
- 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
Tänään pyörit ajatuksissa enemmän, kun erehdyin lukemaan palstaa
En saisi, silti toivon että sinä vielä palaat ja otetaan oikeasti selvää, hioituuko särmät ja sulaudummeko yhteen. Vuod225154- 254338
- 272461
- 342244
- 371998
- 151918
En ole koskaan kokenut
Ennen mitään tällaista rakastumista. Tiedän että kaipaan sinua varmaan loppu elämän. Toivottavasti ei tarvitsisi vain ka191587- 121521
Voi ei! Jari Sillanpää heitti keikan Helsingissä - Hämmästyttävä hetki lavalla...
Ex-tangokuningas on parhaillaan konserttikiertueella. Hän esiintyi Savoy teatterissa äitienpäivänä. Sillanpää jakoi kons211247Kerranki asiat oikein
Ilkka ja muut pienpuolueeet...teitte hyvän työn kun valitsitte pätevän henkilön virkaan eikä kepulle passelia!! Jatkakaa101174