C规范库中生成伪随机数的是rand函数,使用这几个函数要求富含头文件stdlib.h,它从未参数,重返值是四个介于0和RAND_MAX中间的近乎均匀布满的整数。RAND_MAX是该头文件中定义的贰个常量,在分歧的平台上有分歧的取值,但足以无庸置疑它是一个不小的整数。平日大家用到的率性数是限量在有些范围里边的,举个例子0~9,而不是0~RAND_MAX,大家得以用%运算符将rand函数的重临值管理一下:

  • 近年来直接利用随机数,为了以往有助于查阅,总计一下:
    • 在C中提供了rand、random()、arc4random()多少个函数。

iOS-随机数

在C中提供了rand()、srand()、random()、arc4random()多少个函数。
行使 arc4random 生成随机数
1.1 获取三个Infiniti制整数范围在:[0,100)包括0,不包括100

int x = arc4random() % 100;

1.2 获取贰个随机数范围在:[100,200],包括100,包括200

int y =100 +  (arc4random() % 101);

1.3抽出方法

获得贰个即兴整数,范围在[from,to],包括from,包括to

-(int)getRandomNumber:(int)from to:(int)to
    {
      return (int)(from + (arc4random() % (to – from + 1)));
    }

动用 rand() 生成随机数
注意:

在专门的学问的C库中等高校函授数rand()能够生成0~RAND_MAX之间的二个任性数,个中RAND_MAX
是stdlib.h 中定义的三个莫西干发型,它与系统有关。
rand()函数未有输入参数,直接通过表达式rand()来引用;

printf("Random numbers are: %i %i\n",rand(),rand());

伪随机数:
因为rand()函数是按钦命的逐个来爆发整数,由此老是施行下边包车型大巴话语都打印同样的八个值,所以说C语言的任意并不是的确意义上的随便,有时候也叫伪随机数。
为了使程序在历次实施时都能生成叁个新系列的猖狂值,
咱俩普通经过为随机数生成器提供一粒新的即兴种子。函数
srand()(来自stdlib.h)可感到随机数生成器播散种子。只要种子分裂rand()函数就能发出不相同的大肆数种类。
srand()称为随机数生成器的早先化器。
用rand()随机生成在[x,y]内的整数

/*k即为所求范围内随机生成的数,rand()%a的结果最大为a-1*/

int k= x+rand()%(y-x+1)

比较
rand()和random()实际并非贰个确实的伪随机数爆发器,在采用在此之前供给先早先化随机种子,不然每趟改变的随机数同样。

arc4random()
是二个真正的伪随机算法,无需改动随机种子,因为第三遍调用的时候就能够自动生成。并且范围是rand()的两倍。在华为中,RAND_MAX是0x7fffffff
(2147483647),而arc4random()再次来到的最大值则是 0x一千00000 (4294967296)。

无误度比较:arc4random() > random() > rand()。

//  1. rand(),不加这句每次产生的随机数不变
srand((unsigned)time(0)); 
        int i = rand() % 100;      

// 2. random()
 srandom(time(0));
        int i = random() % 100;

// 3. arc4random() 
int i = arc4random() % 100 ;

在C中提供了rand()、srand()、random()、arc4random()多少个函数。 使用
arc4random 生成自由数 1.1
获取二个即兴整数范围在:[0,100)包括0,不…

int x = rand() % 10;

应用 arc4random 生成随机数
  • 1.1 获取多个自由整数范围在:[0,100)包括0,不包括100

int x = arc4random() % 100;

+ 1.2 获取一个随机数范围在:[100,200],包括100,包括200```objcint y =100 + (arc4random;
  • 1.3收取方法
    • 赢得二个无限制整数,范围在[from,to],包括from,包括to

 -getRandomNumber:from to:to{ return (from + (arc4random() % (to – from + 1)));}

C标准库允许大家温馨钦点一个初值,然后在此基础上扭转伪随机数,这些初值称为Seed,能够用srand函数钦赐Seed。平常我们通过其余门路猎取二个不鲜明的数作为Seed,比如调用time函数得到当前系统时间距一九六七年八月1日00:00:00的秒数,然后传给srand

接纳 rand() 生成随机数

  • 注意:
    • 在正儿八经的C库中等高校函授数rand()能够生成0~RAND_MAX之间的三个大肆数,当中RAND_MAX
      是stdlib.h 中定义的多个卡尺头,它与系统有关。
    • rand()函数未有输入参数,间接通过宣布式rand()来援用;

printf(“Random numbers are: %i %i\n”,rand;“`

  • 伪随机数:
    • 因为rand()函数是按钦命的依次来发生整数,因而老是实施上边的言语都打字与印刷相同的七个值,所以说C语言的专擅并非当真含义上的即兴,一时候也叫伪随机数
  • 为了使程序在历次实行时都能生成三个新系列的大肆值,
    • 笔者们经常通过为随机数生成器提供一粒新的轻松种子。函数
      srand()(来自stdlib.h)可感到随机数生成器播散种子。只要种子不相同rand()函数就能够产生差异的随机数体系。
    • srand()称为随机数生成器的早先化器。

  • 用rand()随机变化在[x,y]内的整数

/*k即为所求范围内随机生成的数,rand()%a的结果最大为a-1*/int k= x+rand

srand(time(NULL));

比较

  • rand()和random()实际并非二个真正的伪随机数产生器,在运用以前须要先初叶化随机种子,不然每一遍改造的随机数同样。

  • arc4random()
    是三个当真的伪随机算法,不须要扭转随机种子,因为第贰次调用的时候就能够自动生成。并且范围是rand()的两倍。在索爱中,RAND_MAX是0x7fffffff
    (2147483647),而arc4random()再次来到的最大值则是 0x一千00000
    (4294967296)。

  • 正确度相比较:arc4random() > random() > rand()。

// 1. rand(),不加这句每次产生的随机数不变srand(time; int i = rand() % 100; // 2. random() srandom; int i = random() % 100;// 3. arc4random() int i = arc4random() % 100 ;

写一个小程序,生产随机数并打字与印刷出来,并以可视化的款式打字与印刷直方图:

value how many  0 10130  1 10072  2 9990  3 9842  4 10174  5 9930  6 10059  7 9954  8 9891  9 9958

0  1  2  3  4  5  6  7  8  9    *  *  *  *     *  *  *     *  *     *  *     *  *  *     *        *  *        *                    *                    *

 1 /*************************************************************************   2     > File Name: random.c   3     > Author: qin   4     > Mail: qin11745@gmail.com    5     > Created Time: 2013年08月02日 星期五 09时23分46秒   6  ************************************************************************/   7    8 #include<stdio.h>   9 #include<stdlib.h>  10 #define N 100//定义保存随机数数组的大小(产生N个随机数)  11 #define C 100//定义保存各个随机数出现的次数的数组的大小  12 #define UPPER 10 //定义随机数的最大值(使随机数在0-UPPER之间,UPPER<=20&&UPPER<=N)  13   14 int a[N];//保存随机数的数组  15 int histogram[C];//保存各个随机数个数的数组  16   17 void get_random(int upper_bound)//获取0-upper_bound内的随机数  18 {  19     int i;  20     srand(time(NULL));  21     for (i = 0; i < N ;i++)  22         a[i] = rand() % upper_bound;  23 }  24   25 int get_max(int a[],int num)//获取一个数组之中的最大值  26 {  27     int i;  28     int max;  29     max = a[0];  30     for(i = 1; i< num ;i++)  31         if(max<a[i])  32             max=a[i];  33     return max;  34 }  35   36 void print_random()//打印随机数柱状图  37 {  38     int i,j,m;  39     m = get_max(&histogram,N);  40     int temp[N];  41     printf("max is %d\n",m);  42     for (i = 0; i < UPPER;i++)  43         printf("%d\t",i);  44         printf("\n");  45         printf("\n");  46     for (i = 0; i < N;i++)  47         temp[i] = histogram[i];  48   49     for (i = 0; i < m ;i++)  50     {  51         for(j = 0; j < N;j++)  52         {  53            //printf("%d",temp[j]);  54             if((temp[j])>0)  55                 printf("*");  56             printf("\t");  57         temp[j]--;  58         }         59         printf("\n");  60     }  61       62 }  63   64 /*  65 int count(int value)//统计各个数的出现次数(效率低下)  66 {  67     int count =0,i;  68     for(i = 0;i < N;i++)  69         if(a[i] == value)  70             ++count;  71     return count;  72 }  73 */  74   75 void get_count()//获取每个数字的出现频率(利用a[i]的值作为histogram[]的下标)  76 {  77     int i = 0;  78     for(i = 0; i < N;i++)  79         histogram[a[i]]++;  80 }  81   82 int main(void)//主函数  83 {  84     int i = 0;  85     get_random(UPPER);  86    // for(i = 0; i < 10 ;i++)  87    //     printf("%d\t%d\n",i,count(i));  88    // printf("\n");  89     get_count();  90     printf("value\thowmany\n");  91     for (i = 0;i < UPPER;i++)  92         printf("%d\t%d\n",i,histogram[i]);  93     print_random();  94     return 0;  95 }

打印效果:

[qin@localhost c]$ ./random  value   howmany  0       6  1       11  2       15  3       9  4       6  5       8  6       12  7       8  8       15  9       10  max is 15  0       1       2       3       4       5       6       7       8       9    *       *       *       *       *       *       *       *       *       *  *       *       *       *       *       *       *       *       *       *  *       *       *       *       *       *       *       *       *       *  *       *       *       *       *       *       *       *       *       *  *       *       *       *       *       *       *       *       *       *  *       *       *       *       *       *       *       *       *       *          *       *       *               *       *       *       *       *          *       *       *               *       *       *       *       *          *       *       *                       *               *       *          *       *                               *               *       *          *       *                               *               *                  *                               *               *                  *                                               *                  *                                               *                  *                                               *

相见的标题1:

[qin@localhost c]$ gcc random.c -o random  random.c:10:10: 警告:宏名后缺少空白 [默认启用]  random.c:14:1: 错误:程序中有游离的‘\343’  random.c:14:1: 错误:程序中有游离的‘\200’  random.c:14:1: 错误:程序中有游离的‘\200’  random.c: 在函数‘get_random’中:  random.c:21:5: 错误:程序中有游离的‘\343’  random.c:21:5: 错误:程序中有游离的‘\200’  random.c:21:5: 错误:程序中有游离的‘\200’  random.c: 在函数‘print_random’中:  random.c:39:5: 错误:程序中有游离的‘\343’  random.c:39:5: 错误:程序中有游离的‘\200’  random.c:39:5: 错误:程序中有游离的‘\200’  random.c:39:5: 警告:传递‘get_max’的第 1 个参数时在不兼容的指针类型间转换 [默认启用]  random.c:25:5: 附注:需要类型‘int *’,但实参的类型为‘int (*)[100]’  random.c:40:5: 错误:程序中有游离的‘\343’  random.c:40:5: 错误:程序中有游离的‘\200’  random.c:40:5: 错误:程序中有游离的‘\200’  random.c:46:5: 错误:程序中有游离的‘\343’  random.c:46:5: 错误:程序中有游离的‘\200’  random.c:46:5: 错误:程序中有游离的‘\200’  random.c:51:9: 错误:程序中有游离的‘\343’  random.c:51:9: 错误:程序中有游离的‘\200’  random.c:51:9: 错误:程序中有游离的‘\200’  random.c: 在函数‘get_count’中:  random.c:78:5: 错误:程序中有游离的‘\343’  random.c:78:5: 错误:程序中有游离的‘\200’  random.c:78:5: 错误:程序中有游离的‘\200’

那是因为在充分注释的时候相当的大心在第10行的 N 前面增添了三个华语的空格,导致编写翻译出错。

相见的主题素材2:

void print_random()//打印随机数柱状图

函数中采纳了制表符来调整字符间的距离,不知道卫什么换来空格之后打字与印刷的直方图就能够现出变形错位,各样数字现身的频率不能够准确对准,百思不得其解。


Author

发表评论

电子邮件地址不会被公开。 必填项已用*标注