线性全余生成器的分析是错误的吗?
Analysis of Linear congruential generator is wrong?
所以为了更好地理解MSVC++对rand
的实现,我重新实现了它,并试图更好地理解它(我猜是LCG(。
我的实现(几乎完全匹配MSVC++(如下:
// vc++ impl. of random
// Xn+1 = (aXn + i) mod m
// a = 214013, i = 2531011, m = 32768
unsigned int seed = 0;
unsigned int random()
{
seed = seed * 214013L + 2531011L;
// return (seed/(1<<16)) % 32768; (equiv to below)
return seed>>16 & 0x7FFF;
}
为了找到 2 个种子新生成的种子的差异,我认为这只是(214013*h) % 2^32
其中 h 是 2 个初始种子之间的差异。使用相同的逻辑,我计算了 2 个随机生成的数字之间的差异,给定初始种子作为x
和下一个种子作为x+h
,我在种子中取了这个不同的,除以 2^16(或向右移动 16 位(,并删除了最高有效位。
此生成的值似乎是正确的,但在某些情况下除外,例如当 x = 100 和 h = 5000 时。
以下是整个代码:
#include <iostream>
#include <cstdlib>
// vc++ impl. of random
// Xn+1 = (aXn + i) mod m
// a = 214013, i = 2531011, m = 32768
unsigned int seed = 0;
unsigned int random()
{
seed = seed * 214013L + 2531011L;
return seed>>16 & 0x7FFF;
}
int main()
{
// f(x) = (214013x + 2531011) mod 2^32 [LCG]
// g(x) = floor(f(x)/2^16) mod 2^15 [RND]
// h(x) = f(x + h) - f(x) ?= 214013*h mod 2^32
// j(x) = g(x + h) - g(x) ?= 214013*h/2^16 mod 2^15
// x: initial seed
// h: displaecment to next seed (next seed: x + h)
// a, b: first and second randomly generated values using C rand
// c, d: first and second randomly generated values using random
// newSeedA, newSeedB: seed generated from LCG after x and x + h respectively
// diffExp: experimental difference in random values
// diffCalc: calculated/theoretical difference in random vlaues
unsigned int x = 100, h = 50000;
unsigned int a, b, c, d;
unsigned int newSeedA, newSeedB;
int diffExp, diffCalc;
srand(x);
seed = x;
a = rand();
c = random();
newSeedA = seed;
srand(x + h);
seed = x + h;
b = rand();
d = random();
newSeedB = seed;
diffExp = (d - c) % 32768;
diffCalc = (214013*h)>>16 & 0x7FFF;
std::cout << "RANDOM VALUESn";
std::cout << " VC++ rand: " << a << ", " << b << "n";
std::cout << "Custom rand: " << c << ", " << d << "n";
std::cout << "n";
std::cout << "DIFFERENCE IN SEEDn";
std::cout << "Experimental Difference: " << (newSeedB - newSeedA) << "n";
std::cout << " Calculated Difference: " << (static_cast<unsigned int>(214013)*h) << "n";
std::cout << "n";
std::cout << "DIFFERENCE IN VALUESn";
std::cout << "Experimental Difference: " << diffExp << "n";
std::cout << " Calculated Difference: " << diffCalc << "n";
std::cout << "n";
return 0;
}
但是,对于这些值,2 个随机生成的值之间的估计差值比实际差值小 1。我做错了什么吗?
新种子之间的区别确实214013*h
.
这给了种子s
和s + 214013*h
,结果随机输出之间的差异将是(简化之前(diff = ((s + 214013*h >> 16) & 0x7fff) - ((s >> 16) & 0x7fff)
。那么问题本质上是,这个表达式是否独立于s
。
不是。例如,即使取h = 1
,diff
也可以是3(例如s = 0
(或4(例如s = 0x0000bc03
(。
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 在某些循环内使用vector.push_back时出现分段错误
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 线性全余生成器的分析是错误的吗?