C++随机数随机java生成随机数100个0~9之间的整数,输出每个数的出现次数。

c语言中的rand()函数和srand()函数产生随机的整数 - qin_zhangyongheng的专栏
- 博客频道 - CSDN.NET
8679人阅读
&&&&&在C语言中,rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它为种子,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统,为了改变这个种子的值,C提供了srand()函数,它的原形是void
srand( inta)。
可能大家都知道C语言中的随机函数random,可是random函数并不是ANSI
C标准,所以说,random函数不能在gcc,vc等编译器下编译通过。
rand()会返回一随机数值,范围在0至RAND_MAX间。返回0至RAND_MAX之间的随机数值,RAND_MAX定义在stdlib.h,(其值至少为32767)我运算的结果是一个不定的数,要看你定义的变量类型,int整形的话就是32767。
在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。一般用for语句来设置种子的个数。具体见下面的例子。
一 如何产生不可预见的随机序列呢
利用srand((unsigned int)(time(NULL))是一种方法,因为每一次运行程序的时间是不同的。
&&&&&&在C语言里所提供的随机数发生器的用法:现在的C编译器都提供了一个基于ANSI标准的伪随机数发生器函数,用来生成随机数。它们就是rand()和srand()函数。这二个函数的工作过程如下:
<span style="color:#)首先给srand()提供一个种子,它是一个unsigned int类型,其取&#20540;范围从0~65535;
<span style="color:#)然后调用rand(),它会根据提供给srand()的种子&#20540;返回一个随机数(在0到32767之间)
<span style="color:#)根据需要多次调用rand(),从而不间断地得到新的随机数;
<span style="color:#)无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。
&&&&& 下面是0~32767之间的随机数程序:
#include &stdlib.h&
#include &stdio.h&
#include &time.h&&&&&&&&&&& //使用当前时钟做种子
void main( void )
srand( (unsigned)time( NULL ) );&&&&&&&&& //初始化随机数
&&&& for( i = 0; i & 10;i&#43;&#43; )&&&&&&&&&&&&&&&&&&&&&&&&& //打印出10个随机数
&&&&&&&&& printf( & %d\n&, rand() );
&&根据上面的程序可以很容易得到0~1之间的随机数:
#include &stdlib.h&
#include &stdio.h&
#include &time.h&
srand( (unsigned)time( NULL ) );&
&&&&&& for( i = 0; i & 10;i&#43;&#43; )
&&&&&&&&&&& printf( &%5.2f\n&, rand()/32767.0);
&&&&而产生1~100之间的随机数可以这样写:
#include &stdlib.h&
#include &stdio.h&
#include &time.h&
srand( (unsigned)time( NULL ) );&
&&&&&& for( i = 0; i & 10;i&#43;&#43; )
&&&&&&&&&&& printf( &%d\n&, rand()%100&#43;1);
二,三个通用的随机数发生器,推荐用第三个
函数名: rand
功能:随机数发生器
用法: void rand(void);
#include &stdlib.h&
#include &stdio.h&
int main(void)
&& printf(&Ten random numbers from 0 to 99\n\n&);
&& for(i=0; i&10; i&#43;&#43;)
&&&&& printf(&%d\n&, rand() % 100);
&& return 0;
} //这样的一个产生随机数是回出现问题的,因为在开机后运行的产生的随机数是相同的。
三 如何产生设定范围内的随机数
由于rand产生的随机数从0到rand_max,而rand_max是一个很大的数,那么如何产生从X~Y的数呢?
&&&从X到Y,有Y-X+1个数,所以要产生从X到Y的数,只需要这样写:
&&& k=rand()%(Y-X&#43;1)&#43;X;
&&&这样,就可以产生你想要的任何范围内的随机数了。
四,产生不重复的随机数
<span style="color:#) #include &stdlib.h&
#include &stdio.h&
#include&stdio.h&
#include &time.h&&
swap(int *pm,int *pn)&&&&& /*必须用指针进行交换*/
int main(void)
int&& i,a[513];
/*int *pa,**/
srand( (unsigned)time( NULL ) ); /*定义这个可以产生不同的随机数*/
for(i=1;&& i&=512;&& i&#43;&#43;){a[i]=i;printf(&%4d&,a[i]);}
for(i=512;&& i&=1;&& i--)
/* pa=&a[i]; pb=&a[rand()%i&#43;1];*/
& swap(&a[i], &a[rand()%i&#43;1]);&&&& /*加一是从一到i的随机,就不会包含0*/
& /*不用再定义指针,这样结论是一样的*/
&& printf(&\n&)& ;
for(i=1;&& i&=64;&& i&#43;&#43;)
&& printf(&%4d&,a[i] );
getch();&& /*wintc的输出*/
<span style="color:#)
#include &stdlib.h&
#include &stdio.h&
#include&stdio.h&
int main(void)
&& int a[100]={0};& int i,m;
&&& for(i=1;&& i&=99;&& &#43;&#43;i)
&&&& printf(&%4d&,a[i] );
srand( (unsigned)time( NULL ) );
for(i=1; i&=99; i&#43;&#43;)
&&&&&&& while(a[m=rand()%100&#43;1]);
&&&&&&& a[m] =
&&&&&& for(i=1;&& i&=99;&& &#43;&#43;i)
&&&& printf(&%4d&,a[i] );
随机数,顾名思义就是随机产生的、无规则的数。在编程中,有时我们不想手动从键盘输入数据,而想让电脑自动产生一些数据供我们使用(例如生成100个两位数),就要用到随机数。
随机数的生成方法很简单,在C语言中,我们通过调用随机函数rand()来产生随机数。rand函数是C语言的标准库函数,和我们常用的输入输出函数(scanf和printf)一样可以在程序中直接调用。
rand函数的用法如下:
首先在程序开头预处理命令部分加上#include&stdlib.h&,其中&stdlib.h&是C中的标准库头文件,我们在用rand函数时需要用到这个头文件[见文章最后注1]。它的作用是为了对rand()函数进行引用性声明,以便在下面的程序中使用它。这和我们在用到scanf和printf函数时需要在程序开头写上#include&stdio.h&(标准输入/输出头文件)是一样的。
随机函数rand使用的&#26684;式为:
A=rand()%x&#43;y;
这条语句的意思是,自动产生一个以y为下限,以x&#43;y为上限的随机数,并把&#20540;赋给A。即A为y到x&#43;y之间的随机数。
例如,有语句:
a=rand()%89&#43;10;
执行该语句后,a即可得到一个10~100之间的整数赋&#20540;。
注意区别于:
a=rand()%100;
执行这条语句,a可能取&#20540;的上限同样为100,但下限为0,a可以取到10以下的数。相当于:a=rand()%100&#43;0;
下面我们来看一个完整的例子:
[eg.1]输入10个两位数,并把他们的和打印出来。
1.从键盘输入数据:
#include&stdio.h&
void main()
int a[10],sum=0;
printf(&请输入10个2位数:\n&);
for(i=0;i&10;i&#43;&#43;)
scanf(&%d&,&a[i]);
sum=sum&#43;a[i];
printf(&\n&);
printf(&这10个数的和是:%d \n&,sum);
运行结果:
请输入10个两位数:
<span style="color:#& 32& 47& 61& 20& 17& 55& 76& 29& 10
这10个数的和是:361
2.使用随机数:
#include&stdio.h&
#include&stdlib.h&
void main()
int a[10],sum=0;
printf(&系统自动生成随机数:\n&);
for(i=0;i&10;i&#43;&#43;)
a[i]=rand()%89&#43;10;/* a从10-99之间取&#20540;,即a是两位数 */
printf(&%d& &,a[i]);
sum=sum&#43;a[i];
printf(&\n&);
printf(&这10个两位数的和是:%d \n&,sum);
运行结果:
系统自动生成随机数:
<span style="color:#& 54& 25& 77& 44& 70& 96& 87& 94& 88
这10个两位数的和是:686
经运行比较后可以感觉到,使用随机数可以简化程序运行,方便人的工作。
要是你够细心,再次运行上面这个程序,观察结果,你会发现两次系统产生的随机数的&#20540;是完全相同的。这里你一定会问,这些数字不是随机产生的吗?两次的结果怎么会一样?
实际上,rand函数产生的是伪随机数。当你调用它,它产生的数看上去是随机的,但每次执行这个程序时,这些数的顺序都会重复。这是因为rand()会用系统指定的某个数做为一个种子,而且这个数是每次开机时就指定好的,如果不通过其他方法为rand()重新指定种子,则在下次开机前该种子数都不会变。所以每次出现的随机数是一样的。这种重复性是函数rand的一个重要特点。
如果你希望在程序完成后,每次运行时产生一组不同的随机数,那么就要用到另一个标准库函数:srand函数。这个函数就可以为rand函数指定任意的种子。在生成随机数的过程中需要我们把rand和srand两个函数结合使用,这个过程称为随机化。
使用srand函数,需要由我们给系统提供这个种子,这个种子通常是unsigned(无符号)型。
srand函数使用的&#26684;式是:
/* 定义种子为无符号型变量 */
srand(seed);/* 在下边结合使用rand函数,最终生成一组随机数 */
同样,使用这个函数时需要在程序开头写上#include&stdlib.h&。
[eg.2]使用srand函数对例1进行改进:
#include&stdio.h&
#include&stdlib.h&
void main()
int a[10],sum=0;
printf(&please enter seed:\n&);/* 提示输入一个数,作为种子 */
scanf(&%u&,&seed);/* 注意这里%u用来表示无符号数 */
srand(seed);/* 设置随机数生成器的种子 */
printf(&系统自动生成随机数:\n&);
for(i=0;i&10;i&#43;&#43;)
a[i]=rand()%89&#43;10;
printf(&%d& &,a[i]);
sum=sum&#43;a[i];
printf(&\n&);
printf(&这10个两位数的和是:%d \n&,sum);
让我们将这个程序运行几次,并观察其结果。已经可以获得每次不一样的随机数了。
运行结果:
Please enter seed:
<span style="color:#6
系统自动生成随机数:
<span style="color:#& 51& 84& 35& 24& 94& 83& 22& 15& 79
这10个两位数的和是:511
再次运行:
Please enter seed:
<span style="color:#
系统自动生成随机数:
<span style="color:#& 16& 37& 54& 49& 39& 58& 11& 32& 39
这10个两位数的和是:350
但须注意的是,当输入的种子的&#20540;确定时,获得的随机数也会相同。
如:再次输入156作为种子,结果如下:
Please enter seed:
<span style="color:#6
系统自动生成随机数:
<span style="color:#& 51& 84& 35& 24& 94& 83& 22& 15& 79
这10个两位数的和是:511
下面是我写的一个用来随机产生7-9位QQ邮箱的源代码,原理是先用随机函数产生一个<10的整数(这个数是所生成QQ号码的位数),然后判断这个数是否在7~9之间,如果满足要求,下面将一位一位地产生每一位数字,最后与&@qq.com&连接,生成一个QQ邮箱,并写入文件.
VC&#43;&#43;6.0下编译通过
函数produceQQMail()用来产生随机数的代码:
#include&windows.h&
#include&stdio.h&
#include&stdlib.h&
#include&time.h&
#define MAX_ADDRESS 1000
char directory[20];
DWORD writeFile(const char*filename,char*str)
fp=fopen(filename,&a&#43;&);
if(fp==NULL)
puts(&Cannot open this file!&);
return -1;
fprintf(fp,&%s\n&,str);
fflush(fp);
//fputs(str,fp);
DWORD produceQQMail() //→→→→→产生QQ邮箱函数
unsigned int i,
char zj[20];
char compare[20];
for(count=1;count&=MAX_ADDRESS;count&#43;&#43;)
Sleep(600);
srand((unsigned)time(0));
relative=1&#43;(int)(10.0*rand()/(RAND_MAX&#43;1.0));//产生QQ号码的位数
if(relative&7||relative&9)
//判断是否满足所需要的位数
Sleep(100);
for(i=0;i&i&#43;&#43;)
itoa(1&#43;(int)(10.0*rand()/(RAND_MAX&#43;1.0)),&zj[i],10);//生成每一位数字,将其转换为字符型,并保存在数组中
zj[i]='\0';
strcat(zj,&@qq.com&);//连接生成邮箱
if(count&1&&strcmp(compare,zj)==0) //比较前后两者以防出现相同的邮箱
strcpy(compare,zj);
if(writeFile(directory,zj)==1)
printf(&===&生成第%d个QQ邮箱\n&,count);
//system(&cls&);
void main()
puts(&=&请输入您要保存到的文件名及其目录&);
scanf(&%s&,directory);
puts(&=&Now producing QQ mail addresses……&);
produceQQMail();
随机数是怎么产生出来的呢?
可以利用C语言中的种子函数srand(&& )和伪随机函数rand(&&&& )来实现。
& ①&&&&&&&&&& 首先,给srand(m&& )提供一个“种子”m,它的取&#20540;范围是从0~65535。
& ②&&&&&&&&&& 然后,调用rand(&& ),是伪随机数,它会根据提供给srand(&& )的“种子”&#20540;返回一个随机数(在0~32767之间)。
& ③&&&&&&&&&& 根据需要多次调用rand(&& ),从而不断地得到新的随机数。
& ④&&&&&&&&&& 无论何时,你都可以给srand(&& )提供一个新的“种子”,从而进一步“随机化”rand(&&
)的输出结果。
& 例如,取m=17,则执行了srand(17)之后,再执行rand(&&
)函数,将得到输出&#20540;94;第二次调用rand(&& ),会得到26,……反复调用rand(&&
)就能产生一系列的随机数。
& 注意:若m不变,则rand(&& )的输出系列也不变,总是94,26,602,……等等。所以,建议摇号的“种子”选为当前日期或时间,以保证每天的摇号&#20540;都不相同。
一个简单的参考程序 彩票选号器
& 已调试成功的选号器源程序如下,遗憾的是只有伪随机数字发生器,种子(1-65536)不变则数字不变。因此建议以月日作为种子数(如7月27日则输入727)
& #include&stdio.h&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& /*全局变量及函数提前说明:*/&&
& #include&stdlib.h&&&
& typedef&& struct&& liuyu{int&&struct&& liuyu*}&&
& liuyu&& *p,*q,*r,*&&
& int&& L;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& /*元素的个数*/&&
& int&& m=sizeof(test);&&
& void&& build();&&&&&&&&&&&&&&&&&&&&&&&&&&&& /*生成数字循环链表*/&&
& void&& display();&&&&&&&&&&&&&&&&&&&&&&&& /*输出链表*/&&
& /*---------------------------------------------------------*/&&
& void&& build()&&&&&&&&&&&&&&&&&&&& /*数字循环链表的生成*/&&
& {int&&&&
& head=(test*)malloc(m);&&&& /*m=sizeof(test);*/&&
& for(i=1;i&L;i&#43;&#43;)&&
& {p-&data=i;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
& p-&link=(test*)malloc(m);&&&&&&&&&&&&&& /*m=sizeof(test));*/&&
& p-&data=i;&&
& p-&link=&&
& /*---------------------------------------------------------*/&&
& void&& display()&&&&&&&&&&&&&&&&&&&& /*数字循环链表的输出*/&&
& while&& (p-&link!=head)&&
& {printf(&%3d&,p-&data);&&
& printf(&%3d\n&,p-&data);&&
& /*---------------------------------------------------------*/&&
& void&& main(void)&&&&&&&&&&&&&&&&&&&&&&&& /*&& 输出福彩1-36个数字中的7个随机号码*/&&
& {&& L=36;&&
& int&& n,i,j;&&
&&& build();&&
& printf(&random&& number=&);&&
& scanf(&%d&,&n);&&
& srand(n);&&
& for(j=1;j&=7;j&#43;&#43;)&&
&&& {n=rand();&&
&&&&& for(i=1;i&=n;i&#43;&#43;)&&
&&&&&&&&&&&&&&&&&&& {q=p;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& /*&&
删除元素X,注意保存X的前趋元素指针!& */&&
&&&&&&&&&&&&&&&&&&&&& p=p-&}&&
& printf(&%d&,p-&data);&&
& q-&link=p-&&&
& /*---------------------------------------------------------*/&&
& L=10;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& /*&&
马上接着运行体彩10中选7程序& */&&
& build();&&
& printf(&\nrandom&& number2=&);&&
& scanf(&%d&,&n);&&
& srand(n);&&
& printf(&\n\n&);&&
& for(j=1;j&=7;j&#43;&#43;)&&
&&& {n=rand();&&
&&&&& for(i=1;i&=n;i&#43;&#43;)p=p-&&&
& if(p-&data==10)p-&data=0;&&
& printf(&%d&,p-&data);&&
4位数字是没有重复的吧
#include&iostream.h&
#include&stdlib.h&
#include&time.h&
void rnd4(int b[])
int a[10];
for(int i=0;i&10;i&#43;&#43;)
for(i=0;i&4;i&#43;&#43;)
//生成1到m的随机数rn
int rn=rand()%m;
b[i]=a[rn];
//把a[rn]放到数组a的末端
int temp=a[m];
a[m]=a[rn];
void main()
srand(time(0));
//b即是你要的数组
看看得不得:
#include &stdio.h&
#include &math.h&
#define N 3 /*根据你的需要而定*/
void main()
for(j=0;j&N;j&#43;&#43;)
a[j]=rand();
if(a[j]&=1000&&a[j]&10000)
for(j=0;j&N;j&#43;&#43;)
printf(&a[%d]=%d\n&,j,a[j]);
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:92676次
积分:1476
积分:1476
排名:第13550名
原创:46篇
转载:48篇
评论:16条
(2)(1)(1)(12)(1)(1)(3)(16)(2)(3)(3)(2)(1)(8)(3)(5)(15)(9)(5)(1)(2)c++随机数生成
c++随机数生成函数rand(),实质生成伪随机数列。
为生成更加随机的数列,需要srand(unsigned num)来播种。
常用方式srand((unsigned)time(NULL));//增加头文件&time.h&
生成[a,b]之间的随机整数的方法:
1、rand()%(b-a+1)+a;
2、a+b*rand()/RAND_MAX;
两篇引用博文:第一篇讲了基本的方法,第二篇讲了一些限制条件。其实对于第二篇的情况,在随机数的范围有限的情况下,不等概率的影响是可以忽略不计的,但是当随机数区间长度很大时候,上述问题就变得比较有意义了。特别是当区间长度大于RAND_MAX的一半以上时,这种情况就需要认真处理了。
计算机的随机数都是由伪随机数,即是由小M多项式序列生成的,其中产生每个小序列都有一个初始值,即随机种子。(注意:
小M多项式序列的周期是65535,即每次利用一个随机种子生成的随机数的周期是65535,当你取得65535个随机数后它们又重复出现了。)&
我们知道rand()函数可以用来产生随机数,但是这不是真正意义上的随机数,是一个伪随机数,是根据一个数(我们可以称它为种子)为基准以某个递推公式推算出来的一系列数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统。
功能:随机数发生器
用法:int rand(void)
所在头文件: stdlib.h
rand()的内部实现是用线性同余法做的,它不是真的随机数,因其周期特别长,故在一定的范围里可看成是随机的。
rand()返回一随机数值的范围在0至RAND_MAX 间。RAND_MAX的范围最少是在32767之间(int)。用unsigned
int 双字节是65535,四字节是的整数范围。0~RAND_MAX每个数字被选中的机率是相同的。
用户未设定随机数种子时,系统默认的随机数种子为1。
rand()产生的是伪随机数字,每次执行时是相同的;若要不同,用函数srand()初始化它。
功能:初始化随机数发生器
用法: void srand(unsigned int seed)
所在头文件: stdlib.h
srand()用来设置rand()产生随机数时的随机数种子。参数seed必须是个整数,如果每次seed都设相同值,rand()所产生的随机数值每次就会一样。
3.使用当前时钟作为随机数种子
rand()产生的随机数在每次运行的时候都是与上一次相同的。若要不同,用函数srand()初始化它。可以利用srand((unsigned
int)(time(NULL))的方法,产生不同的随机数种子,因为每一次运行程序的时间是不同的。
4.产生随机数的用法
1) 给srand()提供一个种子,它是一个unsigned int类型;
2) 调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到RAND_MAX之间);
3) 根据需要多次调用rand(),从而不间断地得到新的随机数;
4) 无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。
0~RAND_MAX之间的随机数程序
#include &iostream&&
#include &stdlib.h&&
using&namespace&&
int&main()&
&&&&&&&&srand((unsigned)time(NULL));&
&&&&&&&&for(int&i
= 0; i & 10;i++ )&
&&&&&&&&&&&&&&&&cout
&&&&&&&&cout
&&&&&&&&return&0;&
5.产生一定范围随机数的通用表示公式
要取得[a,b)的随机整数,使用(rand() % (b-a))+
要取得[a,b]的随机整数,使用(rand() % (b-a+1))+
要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1;
通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。
要取得a到b之间的随机整数,另一种表示:a + (int)b * rand() / (RAND_MAX + 1)。
要取得0~1之间的浮点数,可以使用rand() / double(RAND_MAX)。
of Programing
如果让你用C++来生成0——N-1之间的随机数,你会怎么做?你可能会说,很简单,看:
srand( (unsigned)time( NULL )
rand() % N;
仔细想一下,这个结果是随机的吗(当然,我们不考虑rand()函数的伪随机性)?
不是的,因为rand()的上限是RAND_MAX,而一般情况下,RAND_MAX并不是N的整数倍,那么如果RAND_MAX % =
r,则0——r之间的数值的概率就要大一些,而r+1——N-1之间的数值的概率就要小一些。还有,如果N &
RAND_MAX,那该怎么办?
下面给出一种比较合适的方案,可以生成任意范围内的等概率随机数
result。最后还有一个更简单的方法。
1、如果N&RAND_MAX+1,则要去除尾数,
R = RAND_MAX-(RAND_MAX+1)%N; //去除尾数
t = rand();
while( t & R ) t = rand();
result = t % N; // 符合要求的随机数
N&RAND_MAX,可以考虑分段抽样,分成[n/(RNAD_MAX+1)]段,先等概率得到段再得到每段内的某个元素,这样分段也类似地有一个尾数问题,不是每次都刚好分到整数段,一定或多或少有一个余数段,这部分的值如何选取?
选到余数段的数据拿出来选取,先进行一次选到余数段概率的事件发生,然后进行单独选取:
r = N % (RAND_MAX+1); //余数
if ( happened( (double)r/N ) )//选到余数段的概率
&&&&&&&&&&&&
result = N-r+myrandom(r); // myrandom可以用情况1中的代码实现
&&&&&&&&&&&&
result = rand()+myrandom(N/(RAND_MAX+1))*(RAND_MAX+1); //
如果选不到余数段再进行分段选取
完整的代码:
#include&iostream.h&
#include&time.h&
#include&stdlib.h&
const double MinProb=1.0/(RAND_MAX+1);
bool happened(double probability)//probability 0~1
if(probability&=0)
if(probability&MinProb)
rand()==0&&happened(probability*(RAND_MAX+1));
if(rand()&=probability*(RAND_MAX+1))
&&& return
long myrandom(long
n)//产生0~n-1之间的等概率随机数
if(n&=RAND_MAX)
long R=RAND_MAX-(RAND_MAX+1)%n;//尾数
t = rand();
while ( t & r )
&&&&&&&&&&&
t = rand();
return t %
long r = n%(RAND_MAX+1);//余数
if( happened( (double)r/n ) )//取到余数的概率
&&&&&&&&&&&
return n-r+myrandom(r);
&&&&&&&&&&&
return rand()+myrandom(n/(RAND_MAX+1))*(RAND_MAX+1);
还有另外一种非常简单的方式,那就是使用
random_shuffle(
RandomAccessIterator _First, RandomAccessIterator _Last ).
例如,生成0——N-1之间的随机数,可以这么写
&algorithm&
#include &vector&
long myrandom( long N )
std::vector&long& vl( N ); //
定义一个大小为N的vector
for ( long i=0; i&N; ++i )
&&&&&&&&&&&&&&
std::random_shuffle( vl.begin(), vl.end() );
return (*vl.begin());
random_shuffle 还有一个三参数的重载版本
random_shuffle(
RandomAccessIterator _First, RandomAccessIterator _Last,
RandomNumberGenerator& _Rand )
第三个参数可以接受一个自定义的随机数生成器来把前两个参数之间的元素随机化。
这个方法的缺陷就是,如果只是需要一个随机数的话,当N很大时,空间消耗很大!
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。&& 查看话题
【求助】产生0~1之间随机数的函数
产生0~1之间随机数的函数 大家帮帮忙好吗
srand( time( NULL ) );&&//种子函数
rand();&&//产生随机数的函数
其实google一下啥都有了 要0和1之间的还要除一下
a = rand()/(RAND_MAX+1.0); 一般的随机函数都是0-1之间的吧 c/c++中返回的是0~RAND_MAX之间的一个数。
一般我们的做法都是把0~1映射到0~n的范围,在c++中只要反过来就可以了。2楼的除法是一种,还可以用求余的办法:
(rand() % 100) / 100.0,这样就得到精度为0.01,0~100间分布的随机数了。
ls说得也很对哦,一般随机函数返回都在0-1间,可惜random不是c标准,所以他们自己做了一个rand,看起来和大环境不是很一致。 这样得到的才是均匀分布的 随机数:
rand() / (float)RAND_MAX a = rand()/(RAND_MAX+1.0);
和rand() / (float)RAND_MAX 是一样的吗 c/c++中返回的是0~RAND_MAX之间的一个数。所以两个差不离,你自己琢磨一下就能发现其中的差别了,半开半闭和全封闭的关系而已。
我发现一个问题讨论到后面总会跑到细枝末节上去... 我参考 java 随机数生成函数写的一个简单的 C++ 版本
typedef unsigned long long uLL;
uLL seed = 1;
void setSeed( uLL s )
& & & & seed =
double nextDouble()&&// 返回下一个 double 型随机数,范围是 0 到 1
& & & & return ( ( ( uLL )next( 26 ) << 27 ) + next( 27 ) ) / 0992.0;&&
int next( int bits )&&// 生成下一个伪随机数
& & & & seed = ( seed * L + 11L ) & 0xFFFFFFFFFFFF;
& & & & return ( int ) ( seed >> ( 48 - bits ) );
使用 nextDouble() 函数就可以返回 0 到 1 之间的伪随机数了。
一般用系统时间来设置随机数种子,即 seed = ( unsigned ) time( NULL ); 建议先google下,那里可是啥都有 给你段代码看看吧!
#define IADD& &
#define IMUL& &
#define MASK& &
#define SCALE&&0.e-9
int randSeedP = 17;
void InitRand (int randSeedI)
&&if (randSeedI != 0) randSeedP = randSeedI;
& & gettimeofday (&tv, 0);
& & randSeedP = tv.tv_
real RandR ()
&&randSeedP = (randSeedP * IMUL + IADD) & MASK;
&&return (randSeedP * SCALE);
#if NDIM == 2
void VRand (VecR *p)
&&s = 2. * M_PI * RandR ();
&&p->x = cos (s);
&&p->y = sin (s);
#elif NDIM == 3
void VRand (VecR *p)
&&real s, x,
&&while (s > 1.) {
& & x = 2. * RandR () - 1.;
& & y = 2. * RandR () - 1.;
& & s = Sqr (x) + Sqr (y);
&&p->z = 1. - 2. *
&&s = 2. * sqrt (1. - s);
&&p->x = s *
&&p->y = s *
#endif 一般我都是自己如下定义一个函数 rand01
#define rand01 (0.9999999*float(rand())/RAND_MAX) 如果只是产生一次随机数,那么比较容易:把系统时间作为种子,然后调用随机函数。如果循环产生多次随机数,那么必须对种子进行手动更改,否则每次产生的随机数序列都是一样的。 Originally posted by richard58272 at
如果只是产生一次随机数,那么比较容易:把系统时间作为种子,然后调用随机函数。如果循环产生多次随机数,那么必须对种子进行手动更改,否则每次产生的随机数序列都是一样的。 谁让计算机只能提供伪随机数,用系统时间作为种子是比较推荐的一种做法。
但是伪的终归是伪的,不过只要大概符合统计归路就可以了 这要看是用什么软件产生随机数了,不同的软件是不同的。
Matlab中直接是rand(n):生成0到1之间的n阶随机数方阵 rand(m,n):生成0到1之间的m×n的随机数矩阵 (现成的函数)
C++中 用a + rand() % n
& && &其中的a是起始值,n是整数的范围。
  a + rand() % (b-a+1) 就表示 a~b之间的一个随机数
若要0~1的小数,则可以先取得0~10的整数,然后均除以10即可得到随机到十分位的10个随机小数,若要得到随机到百分位的随机小数,则需要先得到0~100的10个整数,然后均除以100,其它情况依此类推。
var cpro_id = 'u1216994';
欢迎监督和反馈:本帖内容由
提供,小木虫仅提供交流平台,不对该内容负责。欢迎协助我们监督管理,共同维护互联网健康,如果您对该内容有异议,请立即发邮件到
联系通知管理员,也可以通过QQ周知,我们的QQ号为:8835100
我们保证在1个工作日内给予处理和答复,谢谢您的监督。
小木虫,学术科研第一站,为中国学术科研研究提供免费动力
广告投放请联系QQ: &
违规贴举报删除请联系邮箱: 或者 QQ:8835100
Copyright &
eMuch.net, All Rights Reserved. 小木虫 版权所有}

我要回帖

更多关于 matlab产生整数随机数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信