【问题标题】:random Number generation using xor shift使用异或移位生成随机数
【发布时间】:2021-02-06 14:01:14
【问题描述】:

我想使用异或移位生成随机数。我从维基百科尝试了这个例子,但它生成的随机数像 332584831 1855942593 -276217806 913087829 486807926

我想要介于 0 和 int 最大值之间的随机数。

这是我正在使用的代码示例:

int random_state =1234;

int randomNumber()
{

int result = random_state;
result ^= result << 13;
result ^= result >> 17;
result ^= result << 5;
random_state = result;
return result;
}

【问题讨论】:

  • 考虑将生成的 1 位、2 位等数字的 频率。除非您对结果有偏见,否则大多数数字将是 9 或 10 位数字。有 10^8 个 8 位或更少位的正数,以及 2047483648 int 9 位或 10 位的值。
  • 对于这样的事情,您最好使用unsigned int。这样每个位模式都是有意义的。或者,您可以在返回结果之前屏蔽符号位。这样你仍然可以在内部保留它。
  • 如果种子不为零,则该生成器永远不会生成零。如果为零,则永远不会生成任何其他内容。

标签: c++ c random xor


【解决方案1】:

在执行按位逻辑和移位操作时最好使用无符号整数类型,因为结果值在无符号类型的宽度(以位为单位)方面定义良好。

假设 unsigned int 至少有 18 位宽,并且 INT_MAX 是 2 的幂次方小 1,那么以下应该可以工作:

#include <limits.h>

unsigned int random_state = 1234;

int randomNumber(void)
{
    unsigned int r = random_state;
    r ^= r << 13;
    r ^= r >> 17;
    r ^= r << 5;
    random_state = r;
    return (int)(r & INT_MAX);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    • 2013-05-05
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多