在C中生成随机数

Moo*_*ors 12 c random

在搜索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()所以我无法评论.


R S*_*hko 5

您需要为PRNG播种,以便每次都以不同的值开始.

一个简单但质量低的种子是使用当前时间:

srand(time(0));
Run Code Online (Sandbox Code Playgroud)

这将使您开始但被认为是低质量的(例如,如果您尝试生成RSA密钥,请不要使用它).

背景.伪随机数生成器不会创建真正的随机数序列,只是模拟它们.给定起始点编号,PRNG将始终返回相同的数字序列.默认情况下,它们以相同的内部状态开始,因此将返回相同的序列.

要获得相同的序列,请更改内部状态.改变内部状态的行为称为"播种".