Генерация случайного 32-битного шестнадцатеричного значения в C - PullRequest
1 голос
/ 02 октября 2011

Каков наилучший способ генерации случайного 32-разрядного шестнадцатеричного значения в C? В моей текущей реализации я генерирую каждый бит отдельно, но выходные данные не являются полностью случайными ... многие значения повторяются несколько раз. Лучше ли генерировать все случайные числа, а не генерировать каждый бит отдельно?

Случайное число должно использовать все 32-битное адресное пространство (от 0x00000000 до 0xffffffff)

file = fopen(tracefile,"wb"); // create file
for(numberofAddress = 0; numberofAddress<10000; numberofAddress++){ //create 10000 address
    if(numberofAddress!=0)
        fprintf(file,"\n"); //start a new line, but not on the first one

    fprintf(file, "0 ");
    int space;

    for(space = 0; space<8; space++){ //remove any 0 from the left
        hexa_address = rand() % 16;
        if(hexa_address != 0){
            fprintf(file,"%x", hexa_address);
            space++;
            break;
        }
        else if(hexa_address == 0 && space == 7){ //in condition of 00000000
            fprintf(file,"%x", "0");
            space++;
        }
    }

    for(space; space<8; space++){ //continue generating the remaining address
        hexa_address = rand() % 16;
        fprintf(file,"%x", hexa_address);
    }

}

Ответы [ 2 ]

10 голосов
/ 02 октября 2011
x = rand() & 0xff;
x |= (rand() & 0xff) << 8;
x |= (rand() & 0xff) << 16;
x |= (rand() & 0xff) << 24;

return x;

rand() не возвращает полное случайное 32-разрядное целое число. В прошлый раз, когда я проверял, он возвращался между 0 и 2^15. (Я думаю, что это зависит от реализации.) Так что вам придется вызывать его несколько раз и маскировать его.

0 голосов
/ 02 октября 2011

Вы можете просто создать любое случайное число шириной не менее 32 бит и отформатировать его как шестнадцатеричное. Примеры:

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

uint32_t n;

n = mrand48();    // #1
n = rand();       // #2

FILE * f = fopen("/dev/urandom", "rb");
fread(&n, sizeof(uint32_t), 1, f);  // #3

// ... etc. etc. E.g. Windows Crypto API

char hex[9];
sprintf(hex, "%08X", n);

Теперь hex - строка, содержащая восемь случайных шестнадцатеричных цифр. Не забудьте запустить различные генераторы псевдослучайных чисел (используя srand48() и srand(), соответственно, для № 1 и № 2). Поскольку вам, по сути, придется заполнять PRNG из случайного источника хотя бы одним 32-разрядным целым числом, вы также можете напрямую коснуться случайного источника (если вы не используете time() или что-то «неслучайное», подобное этому) .

...