c - 除了使用时间来生成随机数之外,还有其他选择吗?

标签 c random random-seed

我正在尝试在计算集群中同时运行一段代码的多个实例(大约 2000 个实例)。它的工作方式是我提交作业,集群将在节点经常打开时运行它们,每个节点有多个作业。这似乎在使用时间种子的随机数生成中为大量实例产生了相同的值。

有没有我可以使用的简单替代方案?可重复性和安全性并不重要,快速生成独特的种子才是。最简单的方法是什么,如果可能的话,跨平台方法会很好。

最佳答案

rdtsc 指令是一个非常可靠(且随机)的种子。

在 Windows 中,它可以通过 __rdtsc() 内部函数访问。

在 GNU C 中,它可以通过以下方式访问:

unsigned long long rdtsc(){
    unsigned int lo,hi;
    __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
    return ((unsigned long long)hi << 32) | lo;
}

该指令测量自处理器开机以来的总伪周期数。鉴于当今机器的高频率,两个处理器返回相同值的可能性极小,即使它们同时启动并且时钟频率相同也是如此。

关于c - 除了使用时间来生成随机数之外,还有其他选择吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7617587/

相关文章:

go - 从另一个没有重复的确定性 int 生成

c 打印字符串的实际内容

c - 使用指针数组有问题吗?

python - 随机选择在这种情况下不起作用?

python - 什么是伪随机?

c - srand() — 为什么只调用一次?

java - 使用 threadlocalrandom 模拟掷骰子不会收敛到预期值

java - Objective C 中的确定性洗牌

c - 使用 PortAudio 录音 : Pa_GetStreamReadAvailable not work?

指针和整数警告的比较