在搜索CI中生成随机数的教程时发现了这个主题
当我尝试使用rand()
没有参数的函数时,我总是得到0.当我尝试使用rand()
带参数的函数时,我总是得到值41.每当我尝试使用arc4random()
和random()
函数时,我都会收到LNK2019错误.
这就是我所做的:
#include <stdlib.h>
int main()
{
int x;
x = rand(6);
printf("%d", x);
}
Run Code Online (Sandbox Code Playgroud)
这段代码总是生成41.我哪里错了?我正在运行Windows XP SP3并使用VS2010命令提示符作为编译器.
Aku*_*ete 31
你应该在调用rand之前调用srand()来初始化随机数生成器.
要么使用特定种子调用它,您将始终获得相同的伪随机序列
#include <stdlib.h>
int main ()
{
srand ( 123 );
int random_number = rand();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
或者使用不断变化的来源(即时间函数)来调用它
#include <stdlib.h>
#include <time.h>
int main ()
{
srand ( time(NULL) );
int random_number = rand();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
响应Moon的注释, rand()生成一个随机数,其概率介于0和RAND_MAX之间(在stdlib.h中预定义的宏)
然后,您可以将此值映射到较小的范围,例如
int random_value = rand(); //between 0 and RAND_MAX
//you can mod the result
int N = 33;
int rand_capped = random_value % N; //between 0 and 32
int S = 50;
int rand_range = rand_capped + S; //between 50 and 82
//you can convert it to a float
float unit_random = random_value / (float) RAND_MAX; //between 0 and 1 (floating point)
Run Code Online (Sandbox Code Playgroud)
这对于大多数用途来说可能就足够了,但值得指出的是,在第一种情况下,如果N没有均匀地划分为RAND_MAX + 1,则使用mod运算符会引入轻微的偏差.
随机数生成器很有趣且复杂,人们普遍认为C标准库中的rand()生成器不是一个高质量的随机数生成器,请阅读(http://en.wikipedia.org/wiki/Random_number_generation定义质量).
http://en.wikipedia.org/wiki/Mersenne_twister(来源http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html)是一个受欢迎的高品质随机数字生成器.
另外,我不知道arc4rand()或random()所以我无法评论.
您需要为PRNG播种,以便每次都以不同的值开始.
一个简单但质量低的种子是使用当前时间:
srand(time(0));
Run Code Online (Sandbox Code Playgroud)
这将使您开始但被认为是低质量的(例如,如果您尝试生成RSA密钥,请不要使用它).
背景.伪随机数生成器不会创建真正的随机数序列,只是模拟它们.给定起始点编号,PRNG将始终返回相同的数字序列.默认情况下,它们以相同的内部状态开始,因此将返回相同的序列.
要获得相同的序列,请更改内部状态.改变内部状态的行为称为"播种".