gpt4 book ai didi

c++ - 不使用 cstdlib 生成随机数?

转载 作者:行者123 更新时间:2023-11-30 01:38:42 27 4
gpt4 key购买 nike

这是一个家庭作业问题,但它只是一个更大项目的一小部分。限制之一是我们不得以任何理由使用 STL。

我尝试使用 ctime 和递增修饰符来汇总我自己的 rand() 函数。我认为即使这没有一致的种子,该函数也应该输出半随机数,只要它每秒不超过一次输入相同的修饰符即可。

//notcstdlib.cpp
//<ctime> <cmath>
int rand(int mod)
{
time_t seed;
return std::abs(seed * mod);
}

但是这个示例代码

//main.cpp
#include "notcstdlib.h"
#include <iostream>

int main(int argc, char** argv)
{
int f;
for(int i = 1; i <= 10; i++)
{
f = rand(i);
std::cout << "random num= " << f << "\n";
std::cout << "rand % 10 = " << f%10 << "\n";
}
return 0;
}

始终返回 7 作为第一个值,每隔一个数字仅返回 0 到 8 之间的偶数。

//Output 1              //Output 2              //Output 3
random num= 134514987 | random num= 134514987 | random num= 134514987
rand % 10 = 7 | rand % 10 = 7 | rand % 10 = 7
random num= 13261304 | random num= 24238584 | random num= 27941368
rand % 10 = 4 | rand % 10 = 4 | rand % 10 = 8
random num= 19891956 | random num= 36357876 | random num= 41912052
rand % 10 = 6 | rand % 10 = 6 | rand % 10 = 2
random num= 26522608 | random num= 48477168 | random num= 55882736
rand % 10 = 8 | rand % 10 = 8 | rand % 10 = 6
random num= 33153260 | random num= 60596460 | random num= 69853420
rand % 10 = 0 | rand % 10 = 0 | rand % 10 = 0
random num= 39783912 | random num= 72715752 | random num= 83824104
rand % 10 = 2 | rand % 10 = 2 | rand % 10 = 4
random num= 46414564 | random num= 84835044 | random num= 97794788
rand % 10 = 4 | rand % 10 = 4 | rand % 10 = 8
random num= 53045216 | random num= 96954336 | random num= 111765472
rand % 10 = 6 | rand % 10 = 6 | rand % 10 = 2
random num= 59675868 | random num= 109073628 | random num= 125736156
rand % 10 = 8 | rand % 10 = 8 | rand % 10 = 6
random num= 66306520 | random num= 121192920 | random num= 139706840
rand % 10 = 0 | rand % 10 = 0 | rand % 10 = 0

显然我遗漏了 rand() 的一些重要方面并且我没有实现它。有没有更好的方法来解决这个问题?

最佳答案

你或许应该问问你的老师是否std::rand()也被排除在外,以及您是否真的需要实现自己的伪随机数生成器。或者更好的是,询问您是否被允许使用 <random>这样你就可以使用C++的Mercene Twister引擎,这是一个非常好的伪随机数生成器。

如果您真的需要自己滚动,最简单的替代 std::rand()是一个LCG(线性同余生成器):

#define MY_RAND_MAX = 2147483647
static unsigned long my_rand_state = 1;

void my_srand(unsigned long seed)
{
my_rand_state = seed;
}

long my_rand()
{
my_rand_state = (my_rand_state * 1103515245 + 12345) % 2147483648;
return my_rand_state;
}

然后您可以使用 my_srand() , my_rand()MY_RAND_MAX就像你一样std::srand() , std::rand()RAND_MAX分别是:

// Seed it with the current time.
my_srand(std::time(nullptr));

// Print 1000 random numbers between 0 and MY_RAND_MAX.
for (int i = 0; i < 1000; ++i) {
std::cout << my_rand() << ' ';
}
std::cout << '\n';

这会生成低质量的随机数(它们的分布很差。)请注意 std::rand()也有不好的分布。如果你想要高质量的随机数(意味着良好的分布),你应该使用 C++ <random>算法,使用 std::mt19937 engine(就是Mercene Twister算法,分布很好,周期很大。)

一般来说,避开rand()即可.参见 Stephan T. Lavavej's 30min talk "rand() Considered Harmful" ,任何仍在使用 rand() 的人都必须注意在他们的代码中。

关于c++ - 不使用 cstdlib 生成随机数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47191747/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com