在C语言中,rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它为种子,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的除非你破坏了系统,为了改变这个种子的值,C提供了srand()函数,它的原形是void srand( int a)。
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))是一种方法,因为每一次运行程序的时间是不同的。
Jav中在java.util.Random类中提供了一些关于生成随机数的方法。
- 1: import java.util.Random;
- 2: public class RandomNumber {
- 3: public static void main(String[] args) {
- 4: Random r = new Random();
- 5: System.out.println("随机生成整数nextInt()\n" + r.nextInt());
- 6: System.out.println("随机生成呈高斯分布双精度浮点数nextGaussian():平均值0.0标准差1.0\n"
- 7: + r.nextGaussian());
- 8: System.out.println("随机生成双精度浮点数nextDouble()0.0~1.0\n" + r.nextDouble());
- 9: System.out.println("随机生成nextBoolean(),true 和 false 概率大致相同\n"
- 10: + r.nextBoolean());
- 11: }
- 12: }
在C语言里所提供的随机数发生器的用法:现在的C编译器都提供了一个基于ANSI标准的伪随机数发生器函数,用来生成随机数。它们就是rand()和srand()函数。这二个函数的工作过程如下:
1) 首先给srand()提供一个种子,它是一个unsigned int类型,其取值范围从0~65535;
2) 然后调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间)
3) 根据需要多次调用rand(),从而不间断地得到新的随机数;
4) 无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。 下面是0~32767之间的随机数程序:
- 1: #include <stdlib.h>
- 2: #include <stdio.h>
- 3: #include <time.h>
- 4: void main( void )
- 5: { int i;
- 6: srand( (unsigned)time( NULL ) );
- 7: for( i = 0; i < 10;i++ )
- 8: {
- 9: printf( " %d\n", rand() );
- 10: }
- 11: }
- 12:
- 13: #include <stdlib.h>
- 14: #include <stdio.h>
- 15: #include <time.h>
- 16: main( )
- 17: { int i;
- 18: srand( (unsigned)time( NULL ) );
- 19: for( i = 0; i < 10;i++ )
- 20: printf( "%5.2f\n", rand()/32767.0);
- 21: }
产生0~100之间的随机数:
- 1:
- 2: #include <stdlib.h>
- 3: #include <stdio.h>
- 4: #include <time.h>
- 5: main( )
- 6: { int i;
- 7: srand( (unsigned)time( NULL ) );
- 8: for( i = 0; i < 10;i++ )
- 9: printf( "%d\n", rand()%100+1);
- 10: }
三个常用的随机数发生器:
- 1:
-
-
-
-
- 6:
- 7: #include <stdlib.h>
- 8: #include <stdio.h>
- 9:
- 10: int main(void)
- 11: {
- 12: int i;
- 13:
- 14: printf("Ten random numbers from 0 to 99\n\n");
- 15: for(i=0; i<10; i++)
- 16: printf("%d\n", rand() % 100);
- 17: return 0;
- 18: }
- 19:
- 20:
-
-
-
-
- 25:
- 26:
- 27: #include <stdlib.h>
- 28: #include <stdio.h>
- 29: #include <time.h>
- 30:
- 31:
- 32: int main(void)
- 33: {
- 34: randomize();
- 35: printf("Random number in the 0-99 range: %d\n", random (100));
- 36: return 0;
- 37: }
- 38:
- 39:
- 40:
-
-
-
-
- 45:
- 46:
- 47: #include <stdlib.h>
- 48: #include <stdio.h>
- 49: #include <time.h>
- 50:
- 51: int main(void)
- 52: {
- 53: int i;
- 54:
- 55: randomize();
- 56: printf("Ten random numbers from 0 to 99\n\n");
- 57: for(i=0; i<10; i++)
- 58: printf("%d\n", rand() % 100);
- 59: return 0;
- 60: }
由于rand产生的随机数从0到rand_max,而rand_max是一个很大的数, 首先可以知道从X到Y,有Y-X+1个数,所以要产生从X到Y的数,只需要这样写: k=rand()%(Y-X+1)+X;
- 1:
- 2: #include <stdlib.h>
- 3: #include <stdio.h>
- 4: #include<stdio.h>
- 5: #include <time.h>
- 6: swap(int *pm,int *pn)
- 7: {
- 8:
- 9: int temp;
- 10: temp=*pm;
- 11: *pm=*pn;
- 12: *pn=temp;
- 13: }
- 14:
- 15: int main(void)
- 16: {
- 17: int i,a[513];
- 18:
- 19: srand( (unsigned)time( NULL ) );
- 20: for(i=1; i<=512; i++)
- 21: {
- 22: a[i]=i;
- 23: printf("%4d",a[i]);
- 24: }
- 25: for(i=512; i>=1; i--)
- 26: {
- 27:
- 28: swap(&a[i], &a[rand()%i+1]);
- 29:
- 30: }
- 31: printf("\n") ;
- 32: for(i=1; i<=64; i++)
- 33: {
- 34: printf("%4d",a[i] );
- 35: }
- 36: getch();
- 37: }
- 38:
- 39:
- 40: #include <stdlib.h>
- 41: #include <stdio.h>
- 42: #include<stdio.h>
- 43: int main(void)
- 44: {
- 45: int a[100]={ 0}; int i,m;
- 46: for(i=1; i<=99; ++i)
- 47: {
- 48: printf("%4d",a[i] );
- 49: }
- 50: srand( (unsigned)time( NULL ) );
- 51: for(i=1; i<=99; i++)
- 52: {
- 53: while(a[m=rand()%100+1]);
- 54: a[m] = i;
- 55: }
- 56: for(i=1; i<=99; ++i)
- 57: {
- 58: printf("%4d",a[i] );
- 59: }
- 60: getch();
- 61: }
对于计算机而言,要生成一个真正意义上的随机数是不可能的。程序的运行已经具有了特定的程序流程,我们只能通过数学上的一些算法,数字的随机分布用计算机来模拟生成随机数。在这个过程中时间作为唯一了不可重复的元素,成为生产随机数的主要力量。
对于计算机生成的随机数本质上只能说是伪随机数。
本文转自 secondriver 51CTO博客,原文链接:http://blog.51cto.com/aiilive/839663,如需转载请自行联系原作者