我有一个任务是使用 NIST-800-22 在 C++ 中测试各种伪随机数生成器。 NIST 测试套件要求我转换生成的数字并以二进制格式存储它们,对于整数来说这并不难。生成器仅生成双精度类型数字会出现问题。
我知道 double 类型按照 IEEE 754 标准存储为浮点数,但我真的不知道如何将其转换为二进制。 ChatGPT向我建议了一些解决方案,但是转换后的数字看起来像这样 0011111111100100001010110110010110100000000000000000000000000000,它看起来不是随机的,我认为它对存储的数据干扰太多。
我的问题是,有没有办法读取原始生成的二进制数据,或者如何获取它?
Code Chat 建议我使用:
std::string doubleToBinary(double num) {
uint64_t rawBits;
std::memcpy(&rawBits, &num, sizeof(double));
std::bitset<64> binary(rawBits);
return binary.to_string();
}
仅当
std::string doubleToBinary(double num)
完全等于 sizeof(uint64_t)
时,sizeof(double)
函数才会起作用。 对于大多数系统来说都是如此,但对于任何系统来说不一定如此。要检查给定系统是否确实如此,请参阅Stack Overflow:确保 C++ 双精度数为 64 位。
如果
sizeof(uint64_t) is <
sizeof(double), then
memcpy()will copy more bytes than
rawBits` 可以容纳,从而损坏你的堆栈。
如果
sizeof(uint64_t) is >
sizeof(double), then
memcpy()will only fill part of
rawBits, and the remaining part will be garbage, which means that anything you do with
rawBits`之后将是错误的。
我要做的是声明一个
byte[sizeof(double)]
数组(其中 byte
也称为 uint8_t
),并且我会将 memcpy()
从 double
的地址放入数组中byte
。据我所知,这是“以二进制格式存储的数字”。
我最终会将
byte
的数组转换为std::string
,如果NIST需要这样的转换,但我不知道它是否是这样,即使是这样,我也不知道这个字符串应该是什么格式拥有。