作业帮 > 综合 > 作业

C++产生随机数的程序

来源:学生作业帮 编辑:拍题作业网作业帮 分类:综合作业 时间:2024/04/30 10:55:02
C++产生随机数的程序
r = 2053.0 * r + 13849.0;
s = (int)(r / 65536.0);
r = r - s * 65536.0;
rnd = r / 65536.0;
//rnd能产生0~1之间的随机数
这段程序看不懂啊,为什么这样就能产生随机数呢?
要看r的来源了吧.如果r的来源是某个和时间有关的数 就可以解释了
后三句就是 让某个在65536和0之间的数除以65536获得0和1之间的随机数
再问: 不好意思,忘了写 double r = 1.0; 那第一句是干嘛呢? 2053.0和13849.0这两个数有什么特殊的呢?
再答: r应该是函数外面进来的吧 不是全局变量也得是个指针变量 前一个得出的随机数是后一个随机数的r 然后那两个值貌似是随便找的 为了扩大r的值
再问: int main() { double r = 1.0; ... ... while (...) { r = 2053.0 * r + 13849.0; s = (int)(r / 65536.0); r = r - s * 65536.0; rnd = r / 65536.0; ... ... } return 0; } 完整程序太长了,主函数的结构是这样的。。。 r不是全局变量也不是指针
再答: r不是全局变量也不是指针是因为没有把这部分作为单独的函数写出去而已 while (...) { r = 2053.0 * r + 13849.0; s = (int)(r / 65536.0); r = r - s * 65536.0; rnd = r / 65536.0; ... ... } 总之相对于这段程序 他的生存期够长 并且不会被初始化就行了 这段伪随机数算法的关键在于r是要反复利用的,由于每次r(种子)的值被改变了 ,所以每次输出的值也就会不同。 伪随机算法的目的本来就是生成一个周期足够长的数列,并且尽量均匀的覆盖值域范围。 为达到这一目的2053和65536要尽量互质,65536这个数要越大越好。 当然因为写程序所须要的精度和目的不同65535这个值基本也就足够了 另外,如果加数13849为0则为乘同余法 如果不为零就是混合同余法 对加数没有特别的要求。 像这段程序中的写法 以单一的某个定值为初始的种子,必然的结果就是每次打印出来的结果是一样的。如果将某些持续变化的值(比如程序运行时的时间)作为随机数的种子,将提高随机数的随机性。