【发布时间】:2011-12-09 17:18:28
【问题描述】:
下面的函数运行,但每次运行程序时总是返回相同的数字。有没有办法在我每次运行程序时生成不同的随机数?
int getrand(int min,int max){
int rnum = rand()%(max-min)+min;
return rnum;
}
【问题讨论】:
-
您确实意识到您的代码存在问题有两个原因?首先,
max和min与某些库/API 中的#defines 和函数冲突,其次,%会导致分布不均匀,除非模数(意外)是 2 的幂。“正确”在某个范围内生成随机数的方法是生成随机数并拒绝超出范围的随机数。关于实际问题,您想在程序启动时srand一次。 -
在任何地方都不能有名为
max和min的宏,因为这些是标准库中函数的名称;如果存在这样的宏,则不能使用标准库。 -
@Damon 虽然你必须拒绝一些数字以避免偏见,但你不能仅仅拒绝那些超出范围的数字;如果范围是 [0, 1],您将不得不拒绝大量数字。
-
@JamesKanze:Windows API 是其中
min和max是 宏的API 的一个示例(除非您明确禁用它们)。是的,它们与<algorithm>中的模板类冲突,这实际上是将它们作为函数的“某些库”的示例。我说的到底哪里不对?一个名为min或max的变量由于这个确切原因有问题。 -
@Damon 如果您使用正确的编译器调用,Windows API 不会定义它们(尽管不可否认,它不应该定义它们,句号)。使用
min和max作为局部变量绝对没有错。