c++ - 特殊的简单随机数发生器

标签 c++ c algorithm math

如何创建一个函数,每次调用都会生成一个随机整数?该数字必须尽可能随机(根据 uniform distribution )。只允许使用一个静态变量和最多 3 个基本步骤,其中每个步骤只包含一个 arity 的基本算术运算。 1 或 2。

例子:

int myrandom(void){
  static int x;
  x = some_step1;
  x = some_step2;
  x = some_step3;
  return x;
}

基本的算术运算是+、-、%、and、not、xor、or、左移、右移、乘法和除法。当然,不允许使用 rand()、random() 或类似的东西。

最佳答案

Linear congruential generators 是最古老和最简单的方法之一:

int seed = 123456789;

int rand()
{
  seed = (a * seed + c) % m;
  return seed;
}

只有几 strip 有基本算术运算的指令,这就是你所需要的。

请注意,此算法只有在以特定方式选择 acm 时才能正常工作!

为了保证这个序列的最长周期,cm应该互素,a-1应该能被所有素数整除m 的因数,如果 m 能被 4 整除,也适用于 4。

Wikipedia 上显示了一些 examples of parameters:例如,某些编译器的 ANSI C 建议 m = 2³¹、a = 1103515245 和 c = 12345.

关于c++ - 特殊的简单随机数发生器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3062746/

相关文章:

c++ - std::vector new 内存不足

c++ - 如何将一维数组与二维数组进行比较(C++)

C++ Protobufs::如何使用 MergeFrom() 删除特定字段?

c - 实现基于整数的幂函数 pow(int, int) 的最有效方法

java - 使用递归找到所有可能的最长递增子序列

C++ for_each 算法和字符串

c++ - 如何将可变大小的 char 数组放入结构中?

c++ - 定期调用 GetProcessTimes 返回相同的结果

c - 为什么会出现 C malloc 断言失败?

php - 需要算法或 MySQL 查询建议