C++ 按rand创建随机整数

C++ 按rand创建随机整数,c++,random,C++,Random,我想编写一个加密应用程序,需要一个函数来创建一个iv。要创建该iv,我想使用rand()(即使这不安全,我还是希望稍后重写大部分代码)。这就引出了我的问题:rand()只返回从0到rand_MAX的值(在我的机器上rand_MAX是32767),如果rand_MAX>=65535,我不知道是否可以使用这样的代码: void generate_iv(unsigned char* char_buf, int len){ union { //treat char_buf like a shor

我想编写一个加密应用程序,需要一个函数来创建一个iv。要创建该iv,我想使用rand()(即使这不安全,我还是希望稍后重写大部分代码)。这就引出了我的问题:rand()只返回从0到rand_MAX的值(在我的机器上rand_MAX是32767),如果rand_MAX>=65535,我不知道是否可以使用这样的代码:

void generate_iv(unsigned char* char_buf, int len){
    union { //treat char_buf like a short_buf
        unsigned char* char_buf;
        unsigned short* short_buf;
    }
    int i;
    for (i = 0; i < len / 2; i++){ //fill short_buf with random values
        short_buf[i] = (unsigned short) rand();
    }
    if (len & 0x01){ //could not fill char_buf with 2-byte short values completely
        char_buf[len - 1] = (unsigned char) rand();
    }
}
void generate_iv(无符号字符*char_buf,int len){
联合{//把char_buf当作一个短小的buf
无符号字符*char_buf;
无符号短*短_buf;
}
int i;
对于(i=0;i
当然,这在每台机器上都很容易编译,但它在RAND_MAX<65535的机器上不起作用,因为这样函数就不会填满每一位

始终有效的代码是:

void generate_iv(unsigned char* char_buf, int len){
    int i;
    for (i = 0; i < len; i++){
        char_buf = (unsigned char) rand();
    }
}
void generate_iv(无符号字符*char_buf,int len){
int i;
对于(i=0;i
这段代码应该可以正常工作,但它并不像上面的代码那样有效。 我的问题是:在这种情况下,是否有最佳的效率和可移植性?是否有更安全的方法(可能更容易实现)来生成随机数,或是获得恒定大小的随机数?

如您所述,
rand()
不安全,因此,不管这个问题如何,我都会提到手头的问题

假设
rand()
生成一个15位的数字,而您想要一个16位的数字,您只需执行以下操作:

int a = rand();
int b = rand()&1;
return a | (b<<15);
顺便说一句,不要忘记在程序开始时使用一些随机输入为RNG种子,例如:

srand((unsigned int)time(NULL));

如果您正在编写加密应用程序,我当然不会推荐
rand
。有一个漂亮闪亮的
头,它的性能要好得多,并且没有一个可能非常低的最大值(即使是32位
INT
INT
在支持64位时也很低)。您不应该使用
rand
进行加密。看看C++11库,就像我说的,我只是想用任意一个随机函数来测试程序,rand()只是我第一个想到的。我知道使用rand会造成安全性缺失。所以我更高兴的是,你给我展示了一个解决问题的方法和一个全新的“探索”库。我刚刚编译了一个包含的程序,我的编译器(Mingw,g++)退出了,并说这个功能仍然是实验性的。我真的可以相信吗?
srand((unsigned int)time(NULL));