【问题标题】:Filling a long int array with random numbers用随机数填充长整数数组
【发布时间】:2014-04-13 18:50:33
【问题描述】:

我正在尝试使用“gcry_randomize”填充一个数组,其中每个条目是四个字节。

我认为因为 long 由 4 个字节表示并且我只需要正数,所以我使用了一个包含 64 个条目的无符号长指针数组。然后我使用 gcry_randomize 函数用四个字节填充每个条目并尝试将其打印出来。关于 printf-function 存在编译器错误,但它正在工作。

    unsigned long int* random_numbers[64];

    for(index = 0; index < 64; index++){
    gcry_randomize( random_numbers[index], 4, GCRY_STRONG_RANDOM);
        printf("Random number: %lu \n", random_numbers[index]);
}

但是,结果并不是真正随机的,也不是我预期的大小(4 个字节而不是 1 个字节):

Random Number 0: 32535136 
Random Number 1: 32535168 
Random Number 2: 32535200 
Random Number 3: 32535232 
Random Number 4: 32535264  

我应该将指针更改为无符号字符指针,然后将其转换为长整数吗?我的代码的下一步将以模数计算该数字,因此需要一个长整数。 另一种选择是创建一个 256 字节的随机 char 字符串,然后将字符串拆分为 4 个字节的部分,将其转换为 long 并保存。我用这种方法遇到的问题是我不知道如何读取 char 字符串的特定部分。

【问题讨论】:

    标签: c arrays random long-integer gnupg


    【解决方案1】:

    gcry_randomize 用随机 字节 填充缓冲区。因此,您可能会得到 4 或 8 个随机字节,具体取决于您的架构。

    当你这样做时,你可以这样做

    unsigned long int random_numbers[64];
    
    for(index = 0; index < 64; index++) {
        gcry_randomize(&random_numbers[index], sizeof(random_numbers[index]), GCRY_STRONG_RANDOM);
        printf("Random number: %lu \n", random_numbers[index]);
    }
    

    您之前所做的是将未初始化的指针传递给 gcry_randomize,这会导致未定义的行为。

    更新:

    无需动态分配内存。如果你想先把随机字节放在一个单独的数组中,你可以在堆栈上使用一个字节数组

    unsigned char buf[4];
    gcry_randomize(buf, sizeof(buf), GCRY_STRONG_RANDOM);
    

    【讨论】:

    • 谢谢!这是有道理的,现在我弄错了。是否建议首先为每个数组条目分配四个字节?
    猜你喜欢
    • 2013-09-16
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 2017-06-04
    相关资源
    最近更新 更多