使用c语言生成随机数的示例分享_C 语言

这是一个自己用c写的不重复产生随机数的代码,且只有输入q才能退出程序。

复制代码 代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX  100

int main(void)
{
 int i, j, flag, num, a[MAX] = { 0 }, max, ch;
 srand((unsigned)time(NULL));

 printf("Please input max number<1-39>(q to quit): ");

  a:while ((scanf("%d", &max)) == 1)
 {
  if (max >= 40)
  {
   printf("Please input max number<1-39>(q to quit): ");
   while (getchar() != '\n')
    continue;
   continue;
  }

  for (i = 0; i < max; ++i)
  {
   do{num = rand() % 41 + 1;
   }while(num==8||num==36);
   flag = 1;
   for (j = 0; j < i; ++j)
   {
    if (num == a[j] || num == 8 || num == 36)
    {
     flag = 0;
     break;
    }
   }
   if (flag)
    a[i] = num;
   else
    --i;
  }
  while
   (getchar() != '\n') continue;
  for (i = 0; i < max; ++i)
   printf("%d ", a[i]);
  printf("\n");
  printf("Please input max number<1-39>(q to quit): ");
 }
 if (getchar() != 'q')
 {
  puts("q to quit,please!");
  printf("Please input max number<1-39>(q to quit): ");
  while (getchar() != '\n')
   continue;
  goto a;
 }
 printf("Bye!");
 return 0;
}

这里有一个比较详细的说明,大家可以看一下

在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))是一种方法,因为每一次运行程序的时间是不同的。

在C语言里所提供的随机数发生器的用法:现在的C编译器都提供了一个基于ANSI标准的伪随机数发生器函数,用来生成随机数。它们就是rand()和srand()函数。这二个函数的工作过程如下:

1) 首先给srand()提供一个种子,它是一个unsigned int类型,其取值范围从0~65535;

2) 然后调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间)

3) 根据需要多次调用rand(),从而不间断地得到新的随机数;

4) 无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。

下面是0~32767之间的随机数程序:

复制代码 代码如下:

#include <stdlib.h>
#include <stdio.h>
#include <time.h>    //使用当前时钟做种子

void main( void )
{int i;
srand( (unsigned)time( NULL ) );   //初始化随机数
     for( i = 0; i < 10;i++ )     //打印出10个随机数
   printf( " %d\n", rand() );
}

根据上面的程序可以很容易得到0~1之间的随机数:

复制代码 代码如下:

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
main( )
{int i;
srand( (unsigned)time( NULL ) ); 
for( i = 0; i < 10;i++ )
  printf( "%5.2f\n", rand()/32767.0);
}

而产生1~100之间的随机数可以这样写:

复制代码 代码如下:

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
main( )
{int i;
srand( (unsigned)time( NULL ) );
for( i = 0; i < 10;i++ )
printf( "%d\n", rand()%100+1);
}

二,三个通用的随机数发生器,推荐用第三个

函数名: rand
功能: 随机数发生器
用法: void rand(void);
程序例:

复制代码 代码如下:

#include <stdlib.h>
#include <stdio.h>
int main(void)
{
int i;
printf("Ten random numbers from 0 to 99\n\n");
for(i=0; i<10; i++)
printf("%d\n", rand() % 100);
return 0;
}

函数名: random
功能: 随机数发生器
用法: int random(int num);
程序例:

复制代码 代码如下:

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

/* prints a random number in the range 0 to 99 */
int main(void)
{
randomize();
printf("Random number in the 0-99 range: %d\n", random (100));
return 0;
}

函数名: randomize这个比较好!
功能: 初始化随机数发生器
用法: void randomize(void);
程序例:

复制代码 代码如下:

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main(void)
{
int i;
randomize();
printf("Ten random numbers from 0 to 99\n\n");
for(i=0; i<10; i++)
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+1)+X;

 这样,就可以产生你想要的任何范围内的随机数了。

四,产生不重复的随机数
1)

复制代码 代码如下:

#include <stdlib.h>
#include <stdio.h>
#include<stdio.h>
 #include <time.h>
swap(int *pm,int *pn)/*必须用指针进行交换*/
{
int temp;
temp=*pm;
*pm=*pn;
*pn=temp;
}

int main(void)
{
inti,a[513];
/*int *pa,*pb;*/
srand( (unsigned)time( NULL ) ); /*定义这个可以产生不同的随机数*/
for(i=1;i<=512;i++){a[i]=i;printf("%4d",a[i]);}
for(i=512;i>=1;i--)
{
 /* pa=&a[i]; pb=&a[rand()%i+1];*/
swap(&a[i], &a[rand()%i+1]);/*加一是从一到i的随机,就不会包含0*/
/*不用再定义指针,这样结论是一样的*/
}
printf("\n");
 for(i=1;i<=64;i++)
printf("%4d",a[i] );
getch();/*wintc的输出*/
}

2)

复制代码 代码如下:

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

int main(void)
{
int a[100]={0};int i,m;
 for(i=1;i<=99;++i)
printf("%4d",a[i] );

srand( (unsigned)time( NULL ) );

for(i=1; i<=99; i++)
{
 while(a[m=rand()%100+1]);
 a[m] = i;
}
for(i=1;i<=99;++i)
printf("%4d",a[i] );

getch();
}

时间: 2024-07-28 18:09:16

使用c语言生成随机数的示例分享_C 语言的相关文章

用C语言获取文件的大小示例分享_C 语言

查了一下发现同C语言的文件操作函数便可以很容易的实现这样的功能.在自己实现的函数中使用到的函数就只有fseek和ftell.它们的说明如下: fseek 语法: #include <stdio.h> int fseek( FILE *stream, long offset, int origin ); 函数fseek()为给出的流设置位置数据. origin的值应该是下列值其中之一(在stdio.h中定义): 名称 说明 SEEK_SET 从文件的开始处开始搜索 SEEK_CUR 从当前位置开

纯c语言实现面向对象分析与示例分享_C 语言

C语言的对象化模型面向对象的特征主要包括:.封装,隐藏内部实现.继承,复用现有代码.多态,改写对象行为1.1  封装封装是一种信息隐蔽技术,它体现于类的说明,是对象的重要特性.封装使数据和加工该数据的方法(函数)封装为一个整体,以实现独立性很强的模块,使得用户只能见到对象的外特性(对象能接受哪些消息,具有那些处理能力),而对象的内特性(保存内部状态的私有数据和实现加工能力的算法)对用户是隐蔽的.封装的目的在于把对象的设计者和对象者的使用分开,使用者不必知晓行为实现的细节,只须用设计者提供的消息来

c语言尾队列tailq使用示例分享_C 语言

queue和list的结构定义和操作都在'sys/queue.h'中完成, 主要定义了下面四种数据结构: 1单向列表(single-linked lists)2单向尾队列(single-linked tail queue)3列表(lists)4尾队列(tail queues) 使用示例 复制代码 代码如下: #include <stdio.h>#include <stdlib.h>#include <sys/queue.h> /*  定义一个结构体,它只是尾队列的一个元

c++冒泡排序示例分享_C 语言

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端,故名.由于冒泡排序简洁的特点,它通常被用来对于计算机程序设计入门的学生介绍算法的概念. 复制代码 代码如下: #include <stdio.h>int swap(int *a,

c++读取sqlserver示例分享_C 语言

复制代码 代码如下: // ReadSqlConsole.cpp: 主项目文件. #include "stdafx.h"#include <iostream>#include<iostream>#include<iomanip>//for setw()#include"windows.h" #import "C:\Program Files\Common Files\System\ado\msado15.dll"

c++输出斐波那契数列示例分享_C 语言

复制代码 代码如下: #include "stdio.h" int Feibo(int Num){if(Num == 1 || Num == 2){return 1;}else{return Feibo(Num - 1) + Feibo(Num - 2);}} void main(){int NumIn,i;scanf("%d", &NumIn);for(i=1;i<NumIn;i++){printf("%d ",Feibo(i))

c++判断是否为目录的示例分享_C 语言

复制代码 代码如下: #include<sys/stat.h>#include<unistd.h>int is_dir(char *path){  struct stat buf;  if(lstat(path , &buf) < 0){    return FALSE;  }  int ret = __S_IFDIR & buf.st_mode;  if(ret){    return TRUE;  }  return FALSE;}

c语言读取csv文件和c++读取csv文件示例分享_C 语言

C读取csv文件 复制代码 代码如下: #include <stdio.h>#include <string.h> char *trim(char *str){    char *p = str;     while (*p == ' ' || *p == '\t' || *p == '\r' || *p == '\n')        p ++;    str = p;     p = str + strlen(str) - 1;     while (*p == ' ' ||

显示内存状态示例分享_C 语言

复制代码 代码如下: #include <stdio.h>void memstat(void *memory, size_t memsize) { printf("-------memory------ ----\n"); for(int i=0; i<memsize; i++) {  char *p = (char*) memory;  printf("%d%d%d%d "    , 0x1 & p[i] >> 3    ,