C语言中如何定义一个从1~7的随机数。

作者&投稿:廉妮 (若有异议请与网页底部的电邮联系)
c语言,如何产生随机数~

本文由青松原创并依GPL-V2及其后续版本发放,转载请注明出处且应包含本行声明。\x0d\x0a\x0d\x0aC++中常用rand()函数生成随机数,但严格意义上来讲生成的只是伪随机数(pseudo-random integral number)。生成随机数时需要我们指定一个种子,如果在程序内循环,那么下一次生成随机数时调用上一次的结果作为种子。但如果分两次执行程序,那么由于种子相同,生成的“随机数”也是相同的。\x0d\x0a\x0d\x0a在工程应用时,我们一般将系统当前时间(Unix时间)作为种子,这样生成的随机数更接近于实际意义上的随机数。给一下例程如下:\x0d\x0a\x0d\x0a#include \x0d\x0a#include \x0d\x0a#include \x0d\x0ausing namespace std;\x0d\x0a\x0d\x0aint main()\x0d\x0a{\x0d\x0a double random(double,double);\x0d\x0a srand(unsigned(time(0)));\x0d\x0a for(int icnt = 0; icnt != 10; ++icnt)\x0d\x0a cout << "No." << icnt+1 << ": " << int(random(0,10))<< endl;\x0d\x0a return 0;\x0d\x0a}\x0d\x0a\x0d\x0adouble random(double start, double end)\x0d\x0a{\x0d\x0a return start+(end-start)*rand()/(RAND_MAX + 1.0);\x0d\x0a}\x0d\x0a/* 运行结果\x0d\x0a* No.1: 3\x0d\x0a* No.2: 9\x0d\x0a* No.3: 0\x0d\x0a* No.4: 9\x0d\x0a* No.5: 5\x0d\x0a* No.6: 6\x0d\x0a* No.7: 9\x0d\x0a* No.8: 2\x0d\x0a* No.9: 9\x0d\x0a* No.10: 6\x0d\x0a*/\x0d\x0a利用这种方法能不能得到完全意义上的随机数呢?似乎9有点多哦?却没有1,4,7?!我们来做一个概率实验,生成1000万个随机数,看0-9这10个数出现的频率是不是大致相同的。程序如下:\x0d\x0a#include \x0d\x0a#include \x0d\x0a#include \x0d\x0a#include \x0d\x0ausing namespace std;\x0d\x0a\x0d\x0aint main()\x0d\x0a{\x0d\x0a double random(double,double);\x0d\x0a int a[10] = ;\x0d\x0a const int Gen_max = 10000000;\x0d\x0a srand(unsigned(time(0)));\x0d\x0a \x0d\x0a for(int icnt = 0; icnt != Gen_max; ++icnt)\x0d\x0a switch(int(random(0,10)))\x0d\x0a {\x0d\x0a case 0: a[0]++; break;\x0d\x0a case 1: a[1]++; break;\x0d\x0a case 2: a[2]++; break;\x0d\x0a case 3: a[3]++; break;\x0d\x0a case 4: a[4]++; break;\x0d\x0a case 5: a[5]++; break;\x0d\x0a case 6: a[6]++; break;\x0d\x0a case 7: a[7]++; break;\x0d\x0a case 8: a[8]++; break;\x0d\x0a case 9: a[9]++; break;\x0d\x0a default: cerr << "Error!" << endl; exit(-1);\x0d\x0a }\x0d\x0a \x0d\x0a for(int icnt = 0; icnt != 10; ++icnt)\x0d\x0a cout << icnt << ": " << setw(6) << setiosflags(ios::fixed) << setprecision(2) << double(a[icnt])/Gen_max*100 << "%" << endl;\x0d\x0a \x0d\x0a return 0;\x0d\x0a}\x0d\x0a\x0d\x0adouble random(double start, double end)\x0d\x0a{\x0d\x0a return start+(end-start)*rand()/(RAND_MAX + 1.0);\x0d\x0a}\x0d\x0a/* 运行结果\x0d\x0a* 0: 10.01%\x0d\x0a* 1: 9.99%\x0d\x0a* 2: 9.99%\x0d\x0a* 3: 9.99%\x0d\x0a* 4: 9.98%\x0d\x0a* 5: 10.01%\x0d\x0a* 6: 10.02%\x0d\x0a* 7: 10.01%\x0d\x0a* 8: 10.01%\x0d\x0a* 9: 9.99%\x0d\x0a*/\x0d\x0a可知用这种方法得到的随机数是满足统计规律的。\x0d\x0a\x0d\x0a另:在Linux下利用GCC编译程序,即使我执行了1000000次运算,是否将random函数定义了inline函数似乎对程序没有任何影响,有理由相信,GCC已经为我们做了优化。但是冥冥之中我又记得要做inline优化得加O3才行...\x0d\x0a\x0d\x0a不行,于是我们把循环次数改为10亿次,用time命令查看执行时间:\x0d\x0achinsung@gentoo ~/workspace/test/Debug $ time ./test \x0d\x0a0: 10.00%\x0d\x0a1: 10.00%\x0d\x0a2: 10.00%\x0d\x0a3: 10.00%\x0d\x0a4: 10.00%\x0d\x0a5: 10.00%\x0d\x0a6: 10.00%\x0d\x0a7: 10.00%\x0d\x0a8: 10.00%\x0d\x0a9: 10.00%\x0d\x0a\x0d\x0areal 2m7.768s\x0d\x0auser 2m4.405s\x0d\x0asys 0m0.038s\x0d\x0achinsung@gentoo ~/workspace/test/Debug $ time ./test \x0d\x0a0: 10.00%\x0d\x0a1: 10.00%\x0d\x0a2: 10.00%\x0d\x0a3: 10.00%\x0d\x0a4: 10.00%\x0d\x0a5: 10.00%\x0d\x0a6: 10.00%\x0d\x0a7: 10.00%\x0d\x0a8: 10.00%\x0d\x0a9: 10.00%\x0d\x0a\x0d\x0areal 2m7.269s\x0d\x0auser 2m4.077s\x0d\x0asys 0m0.025s\x0d\x0a\x0d\x0a前一次为进行inline优化的情形,后一次为没有作inline优化的情形,两次结果相差不大,甚至各项指标后者还要好一些,不知是何缘由...

编译环境为:vs2013产生1到3的整型随机数的代码如下:#include#include#include#define max 3 //这个函数的意义为:随机生成最大的数为3#define min 1 //这个函数的意义为:随机生成最小的数为1int main(){int num;srand(time(0));num = rand() % (max - min) + min; // 这里的意义,“%”为模运算printf("随机数为:%d
", num);system("pause"); //这个代码可以让弹出的黑框不会一下就消失return 0;}

扩展资料:
根据密码学原理,随机数的随机性检验可以分为三个标准:
条件一、统计学伪随机性。统计学伪随机性指的是在给定的随机比特流样本中,1的数量大致等于0的数量,同理,“10”“01”“00”“11”四者数量大致相等。类似的标准被称为统计学随机性。满足这类要求的数字在人类“一眼看上去”是随机的。
条件二、密码学安全伪随机性。其定义为,给定随机样本的一部分和随机算法,不能有效的演算出随机样本的剩余部分。
条件三、真随机性。其定义为随机样本不可重现。实际上只要给定边界条件,真随机数并不存在,可是如果产生一个真随机数样本的边界条件十分复杂且难以捕捉(比如计算机当地的本底辐射波动值),可以认为用这个方法演算出来了真随机数。
随机数分为三类:
①伪随机数:满足第一个条件的随机数。
②密码学安全的伪随机数:同时满足前两个条件的随机数。可以通过密码学安全伪随机数生成器
计算得出。
③真随机数:同时满足三个条件的随机数。

在C语言中怎么产生随机数呢?

rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数。这是根据一个数,我们可以称它为 种 了,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数。当计算机正常开机后,这个种子的值是定了的(也就是说你将产生的随机数已经定了,每次运行都产生的是相同的随机数),除非你破坏了系统。
为了改变这个种子的值,C提供了 srand()函数,它的原形是void srand( int a)。
初始化随机产生器既rand()函数的初始值,即使把种子的值改成a; 从这你可以看到通过sand()函数,我们是可以产生可以预见的随机序列,那我们如何才能产生不可预见的随机序列呢?我们可能常常需要这样的随机序列,是吧。利用srand((unsign)(time(NULL))是一种方法,因为每一次运行程序的时间是不同的.
下面讲一讲在C语言里所提供的随机数发生器的用法。现在的C编译器都提供了一个基于ANSI标准的伪随机数发生器函数,用来生成随机数。它们就是rand()和srand()函数。这二个函数的工作过程如下:
1) 首先给srand()提供一个种子,它是一个unsigned int类型,其取值范围从0~65535;
2) 然后调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间)
3) 根据需要多次调用rand(),从而不间断地得到新的随机数;
4) 无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。
以下是一个产生随机数的例子:
需要首先使用随机数“种子”初始化,srand函数:
#i nclude <stdlib.h>
#i nclude <stdio.h>
#i nclude <time.h>//使用当前时钟做种子

void main( void )
{
int i;
srand( (unsigned)time( NULL ) );//初始化随机数

/* 打印10个随机数. */
for( i = 0; i < 10;i++ )
printf( " %d\n", rand() );
}

在C语言中,是如何取得这个随机数的?

一个语句:rand();
它的作用就是随机取0到RAND_MAX之间的任何数。ANSI标准指出,RAND_MAX值的范围到少是32767,也就是双字节整数的最大值。 下面我们用一个例子来取得从1到6的随机整数:
#include <stdio.h>
#include <stdlib.h>

main()
{
int i;
for(i=1;i<=20;i++)
printf("%10d",1+(rand()%6));
}

第2行的stdlib.h是rand()函数的头文件。第7行就是 实现功能的语句了。前面我们以经说过函数取的值是介于0到RANDMAX之间的,而我们所要的是1到6之间的整数。用脚想一想就知道:任一整数除以6所得的余数是0~5之间的整数,再加一之后就是1到6了,也就是我们的目标。利用这个原理我们使用%号对随机数进行了缩放。

OK,运行两次程序:
一:6 6 5 5 6 5 1 1 5 3 6 6 2 4 2 6 2 3 4 1
二:6 6 5 5 6 5 1 1 5 3 6 6 2 4 2 6 2 3 4 1

发现:两次运行的结果完全一样。
结论:这算什么随机数。

这种重复性是rand的一个重要特点,在调试程序时,这种重复性是必不可少的,因为它可以证明对程序的修改能够正常运行。

实际上,rand函数产生的是伪随机数。但我们需要的是随机数。于是,我们需要对程序进行随机化,这需要使用标准库函数srand来实现。函数srand需要一个无符号的整型参数,在每次程序执行时用函数rand去生在一组不同的随机数。
所以另一个语句是:srand()再rand()

#include <stdlib.h>
#include <stdio.h>

main()
{
int i;
unsignde seed;

printf("Enter a seed:");
scanf("%u",&seed);
srand(seed);

for( i = 1;i<=20;i++)
printf(""%10d",1+(rand()%6));
}

程序的运行结果是当我们输入不同的SEED时,产生不同组的随机数。这句话的意思有两个:一:当输入相同的SEED时,产生的同组随机数;二:每次运行我们都要输入一个SEED。

如果我们希望不用每次输入SEED值,而且每次运行时SEED值都是不同的,我们可以用下面语句代替上面的第三块的三个语句:

srand(time(NULL));

这会使计算机自动读取自己的时钟以获得SEED值。于是我们就获值了每次运行都会改变的SEED,同样也就获得了真正的随机数

//记:rand()产生一个0~RAND_MAX之间的数(如0~32767,我试了几次RAND_MAX最大只能为32767);
//rand()%n (n<=32767) 就产生了一个0~n的数
//m+rand()%n(n<=32767)就产生的是一个m~m+n的数。
//如果要产生4字节的int随机数,那要另寻方法:
//在网上找到一个:
// int N=0x7fffffff;
// cout<<(int)((double)rand() / (double)(RAND_MAX + 1) * N)<<"\n";
//但测试以后得 (0~0x7ffeffff)
//还有寻找中。。。

我也是个初学者,不过学会随机数的运用源于我们老师给的一个提示,
不知道你编没编过 人与电脑玩《石头剪子布》这个小游戏没!
试着用一楼大哥给的这个随机数的产生编一下吧,我想你会学会用的!
srand(unsigned)time(NULL);
rand();
这就是产生一个随机数的步骤!

rand()函数是C语言中专门用于产生随机数的函数,使用之前添加头文件
#include <stdlib.h>
但是它返回0-RANDMAX之间的一个整数,而RANDMAX是一个宏,通常是65535,也可以自己修改。
如果产生一个1-7之间的随机数比较简单的办法是先对7求余,这样随机数就在0-6之间,然后再加1就可以了,具体语句如下:
int num=rand()%7+1;

rand()%7便是0-6的随即数
rand()%7+1 是 1-7的随机数
或者(rand()+6)%7+1
rand()%11+2 是 2-12的随机数
或者(rand()+10)%11+2

产生a~b的随机数公式:
a+rand()%(b-a)
a+random(b-a)


c语言中,怎么样定义一个字符串变量
1、定义变量字符串。char str[200];定义一个长度最大为200字符的字符串。2、定义常量字符串。由于常量字符串存储在常量空间中,所以只需要定义一个指针,指向该地址即可。如char *s = "test string"。

在c语言中如何定义一个变量,使它的值为一个句子。如果用户输入这个句 ...
回答:你所说的句子是指的字符串吧, C语言中字符串是用字符数组来表示的. #include<stdio.h>#include<string.h>int main(){ char s[20]; gets(s); if(strcmp(s, "hello world")==0)\/\/如果输入的是字符串"hello world" printf("right\\n"); else printf("wrong\\n"); return 0;}

C语言怎么定义一个二进制数
C语言中没有 “二进制数”这种类型,所以没办法直接定义;但可以直接定义16进制数。例:int main(){ int a;scanf("%p",&a);\/\/16进制数输入%p是输入一个十六进制的数scanf("%llx",&a);也可以输入十六进制并且比较正规 printf("%d",a);\/\/十进制输出%d是输出一个十进制的数 printf("0x%x",...

C语言 定义一个5X10的二维字符数组,输入任意5个字符串, 输出其中最短...
include <stdio.h> include <string.h> int GetShortStr(const char (*PStr)[10]){ int MinLen=0;for(int i=0;i<5-1;i++){ for(int j=i+1;j<5;j++){ if(strlen(PStr[MinLen])>strlen(PStr[j])){ MinLen=j;} } } return MinLen;} int main(void){ char Str[5][10]={...

在C语言中如何定义并输入任意个数据
用一个特定的数字表示结束,比如0, 当用户输入0 的时候就停止,可以参考下面的代码:int a[100],i, count;i =0;while(scanf("%d", &a[i]) != EOF) { if (a[i] == 0) break; \/\/ 用户输入了0,表示结束。i++;} count = i-1;...

c语言中,怎么定义一个随意大小的字符串呢?
&cSave); if(i==strSize-1)\/\/当输入到预设内存地址最后一位 { if(cSave=='\\n') { cSave=0; str[i]=cSave; } else { str[i]=0; strSize=maxsize*n++; strSave=str; str=(char *)malloc...

如何用c语言编写一个数字输入程序?
1、首先是鼠标选择单击C语言编程软件创建一个空的C语言文件。2、定义四个整数变量a,b,c,max。三个变量a,b和c用于存储输入的三个数字,max用于存储三个数字的最大值。3、使用scanf语句从键盘输入三个数字。在注意之前不要忘记使用变量。4、使用max可以逐个比较三个数字,并将最大数量存储在最大...

如何用c语言实现:定义一个1~100的int数组,随机从里边选择十个数字?
a[i-1] = a[i];(*p)--;} void input(int *a, int *p){ int m,i;printf("输入元素个数");scanf("%d",&m);for(i = 0; i<m; ++i)scanf("%d",&a[i]);p=m;} void display(int *a, int *p){ int i;for(i = 0; i < *p; ++i)printf("%5d",a[i]);printf(...

在c#中,如何定义一个数组?怎样详细解析一个数组??
1、第一种:string[] Array1=new string[10]。2、第二种string[] Array2={"1","2"}。3、第三种string[] Array3=new string[3]{"1","2","3"}。4、第四种 string[] Array4=new string[]{"1","2","3","4"}。注意事项:C#是一种安全的、稳定的、简单的、优雅的,由C和C++...

如何在c++定义一个学生类以实现平均成绩的计算和查询功能?
1.定义学生类,包括学号、姓名、性别、多门课程的成绩;假设有n个学生,由键盘输入学生信息;2定义类成员函数,计算每个学生的平均成绩;4.同时输出所有学生信息;5.通过输入学生学号或姓名... 1. 定义学生类,包括学号、姓名、性别、多门课程的成绩;假设有n个学生,由键盘输入学生信息;2定义类成员函数,计算每个学生的...

哈巴河县13773827251: C语言中如何定义一个从1~7的随机数.
屠追暖宫: rand()%7便是0-6的随即数rand()%7+1 是 1-7的随机数或者(rand()+6)%7+1rand()%11+2 是 2-12的随机数或者(rand()+10)%11+2

哈巴河县13773827251: c语言如何产生在一定范围内的随机数 -
屠追暖宫: //---------------------------------------------------------------------------#include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) {int a;int t=10,d=100;srand(time(NULL)); /*初始化随机数种子*/ a=rand()%(d-t)+t; /*生成一个[t,d)区间内的整数*/...

哈巴河县13773827251: 怎样用c语言产生一个0到100的随机数 -
屠追暖宫: rand()函数,头文件stdlib.hint num; num = rand()%100;

哈巴河县13773827251: C语言 如何产生1到52之间的不同的随机数 -
屠追暖宫: rand(产生随机数) 相关函数 srand 表头文件 #include<stdlib.h> 定义函数 int rand(void) 函数说明 rand()会返回一随机数值,范围在0至RAND_MAX 间.在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种...

哈巴河县13773827251: 怎样用c语言取一个随机数 -
屠追暖宫: 具体代码如下: #include <stdio.h> #include <stdlib.h> #include <time.h> //用到了time函数 int main() { int i,number; srand((unsigned) time(NULL)); //用时间做种,每次产生随机数不一样 for (i=0; i<50; i++) { number = rand() % 101; //产生0-100的...

哈巴河县13773827251: 用c语言怎样产生随机数啊..产生5个随机数..范围1到11的..如01,04,06,07,11,跪 -
屠追暖宫: int a[5],i; for(i=0;i{ a[i]=rand()%12; } a[i]这个数组就存放了你要的那组数

哈巴河县13773827251: 如何在C语言中生成一定范围内的随机数? -
屠追暖宫: srand((int)time(NULL));设定随机数种子 rand()%100;产生0-99的随机数. 高级点的,假如要产生16-59之间的数,你可以这样写:rand()%44+16(这里44由59-16+1得到).其他情况如法炮制!C语言中用rand()函数产生20-90的随机整数 20-90共有71个数字,所以是rand()%71+20 ; 用rand()生成-20-20的随机数 -20-20共有41个数字,所以是rand()%41-20; 需要注意的是,在运行以上代码之前最好设定一下: srand(time(NULL));//用系统当前时间设置rand()随机序列种子,保证每次运行随机序列不一样

哈巴河县13773827251: 如何在C语言中产生一定范围的随机数 -
屠追暖宫: 调用stdlib头文件 如下:#include<stdlib.h>......void main() { int a; a=rand()%16+85; .......} 就可以了

哈巴河县13773827251: 在C语言中,怎样产生一个0到1的随机数?? -
屠追暖宫: #include void main(void) { int i; srand( (unsigned)time( NULL ) );/*这一句很重要,如果没有的话,每次产生的数据都是不变的.*/ for(i=0;i { printf("%d ",rand()%2);/*产生10个0到1的随机数*/ } }

哈巴河县13773827251: C语言产生1 - 13的随机数 -
屠追暖宫: 先定义一个种子 srand((unsigned)time(NULL)); int k; k=rand()%13+1;就会产生1~13的值

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网