【问题标题】:generate random long unsigned C生成随机长无符号 C
【发布时间】:2012-05-17 22:00:35
【问题描述】:

这是我的代码:

#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <crypt.h>
#include <string.h>
#include <stdlib.h>

int main(void){

int i;
unsigned long seed[2];

/* Generate a (not very) random seed */
seed[0] = time(NULL);
seed[1] = getpid() ^ (seed[0] >> 14 & 0x30000);

printf("Seed 0: %lu ; Seed 1: %lu", seed[0], seed[1]);
return 0;
}

我想生成一些 非常 随机种子,这些种子将用于哈希函数,但我不知道该怎么做!

【问题讨论】:

标签: random


【解决方案1】:

您可以从 /dev/random 读取所需的随机位。

读取时,/dev/random 设备将仅返回熵池中估计的噪声位数内的随机字节。 /dev/random 应该适合需要非常高质量随机性的用途,例如一次性填充或密钥生成。当熵池为空时,来自 /dev/random 的读取将被阻塞,直到收集到额外的环境噪声。(http://www.kernel.org/doc/man-pages/online/pages/man4/random.4.html )

int randomSrc = open("/dev/random", O_RDONLY);
unsigned long seed[2];
read(randomSrc , seed, 2 * sizeof(long) );
close(randomSrc);

【讨论】:

    【解决方案2】:

    Mersenne Twister,它是一个广泛使用的伪随机数生成器,因为它速度很快,周期很长,分布很好。不要尝试编写自己的实现,请使用 available ones 中的任何一个。

    【讨论】:

      【解决方案3】:

      因为算法是确定性的,所以你不能得到非常随机的,只能是伪随机的——在大多数情况下,如果你做得过火,你所拥有的就足够了,例如

      Mac address + IP address + free space on HD + current free memory + epoch time in ms...
      

      那么您可能会削弱算法的性能。

      如果您的解决方案是交互式的,那么您可以为用户设置一个简短的输入任务并让他们为您生成随机数据 - 测量击键之间的时间并将其乘以他们按下的键的代码 - 即使他们重新- 键入相同的字符串,时间会稍微偏离 - 你可以把它混合一下,在它们开始时取模 10 秒,只计算那些击键。

      但如果你真的想要 100% 随机数 - 那么你可以使用 ANU Quantum Vacuum Random number generator - article

      a project on GitHub 是打败坏人的好方法。

      【讨论】:

      • 这可能看起来是随机的,但实际上可能有一个糟糕的分布并且不像预期的那样随机。
      • 但是量子随机数发生器是有保证的——它采用海森堡的不确定性原理——本质上你不可能知道一切,然后问“如果我们有一个完美的真空会发生什么?”事实证明,宇宙发疯了,喷出虚拟粒子只是为了让科学家们感到困惑。
      • 对不起,我说的是你的第一个解决方案(总结各种元素)。量子数生成器,就像所有物理上的 basec 生成器一样,虽然实现起来可能有点困难:) 但是它确实是生成随机数的一种非常好的方法,因为“真正的”有效随机性(我的意思是不基于确定性算法) 基于物理原理。 random.org 使用大气噪声来生成数字。
      • 感谢 github 的链接!我知道他们只是在使用 HTTP 获取服务器上的数据,但它可能有用。
      • 我喜欢 random.org - 好名字
      猜你喜欢
      • 2012-04-17
      • 1970-01-01
      • 1970-01-01
      • 2016-01-05
      • 2018-01-25
      • 1970-01-01
      • 1970-01-01
      • 2021-03-15
      • 1970-01-01
      相关资源
      最近更新 更多