【发布时间】:2020-07-24 02:25:34
【问题描述】:
故事:在C++中使用rand()函数可以得到随机数,使用%可以设置范围。但是,如果我还想添加偏差,那么我还必须在结果中添加偏差。这是太多的工作要做,所以我决定编写自己的函数来处理这个问题。但是我被困在某一点上。
我知道,每次程序运行时我都必须输入一个新序列(srand(time(NULL))),否则我会一直得到相同的数字。
最明显的方法是在main() 函数中插入srand(time(NULL))。但是,我不想这样做,我希望它以某种方式在我包含 .h 文件时自动完成。
假设myFunctions.h:
#include <iostream>
#include <string>
#include <vector>
#include <cstdio>
#include <ctime>
int randint(int start, int end);
和myFunctions.cpp:
#include "myFunctions.h"
/* [start,end) */
int randint(int start, int end)
{
return (rand() % (end - start)) + start;
}
现在,我很困惑应该在哪里添加srand()。如果我在randint() 定义中这样做,我假设,因为时间差太小,time(NULL) 将为循环的每个步骤评估相同的值,并且它会一直提供相同的种子我想在很短的时间内得到随机数,比如:
for(int i = 0; i < 50; i++){
std::cout << randint(0, 3) << std::endl;
}
输出是相同的数字,50 次。所以这证实了我的猜想。
我在我的 randint() 定义中尝试过类似的东西,
int randint(int start, int end)
{
#ifndef SEED
srand(time(NULL));
#define SEED
#endif
return (rand() % (end - start)) + start;
}
但是,它也不起作用,因为我认为 #ifndef 只在预处理阶段执行一次。
所以,在这些尝试之后,我尝试在我的 .h 文件的开头调用 srand(),但我发现事实上你不能在任何函数之外调用函数(例如main() .)
简而言之,我现在陷入困境,任何帮助将不胜感激。
【问题讨论】:
-
只需在程序开始时手动调用
srand() -
@michaeldel 是的,它解决了,但所有这些问题都是关于避免它,如果可能的话。
-
不要使用
rand。使用en.cppreference.com/w/cpp/header/random。rand是 C 时代的老函数,应该避免使用。 -
@Mannoj 如果你检查我的问题,你会发现我理解这些东西没有问题......
-
@ThomasSablik 我会看看,谢谢。