C语言实现不重复随机数生成器及退出功能详解
这是一段用C写的代码,不会重复生成随机数,只能输入q才能退出程序。

#包括
#包括
#包括
#定义最大100
int 主函数(无效)
int i, j, flag, num, a[MAX] = { 0 }, max, ch;
srand((无符号)时间(NULL));
printf("请输入最大数量(q退出):");
a:while ((scanf("%d", &max)) == 1)
如果(最大值 >= 40)
printf("请输入最大数量(q退出):");
while (getchar() != '\n')
继续;
继续;
对于 (i = 0; i < 最大值; ++i)
do{num = rand() % 41 + 1;
} while(num==8||num==36);
标志=1;
对于 (j = 0; j < i; ++j)
if (num == a[j] || num == 8 || num == 36)
标志= 0;
休息;
如果(标志)
a[i] = 数字;
别的
- 我;
尽管
(getchar() != '\n') 继续;
对于 (i = 0; i < 最大值; ++i)
printf("%d", a[i]);
printf("\n");
printf("请输入最大数量(q退出):");
if (getchar() != 'q')
puts("q 退出,请!");
printf("请输入最大数量(q退出):");
while (getchar() != '\n')
继续;
转到一个;
printf("再见!");
返回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 //使用当前时钟作为种子
无效主(无效)
{int 我;
srand( (无符号)时间( NULL ) ); //初始化随机数
for( i = 0; i < 10;i++ ) //打印出10个随机数
printf( " %d\n", rand() );
根据上面的程序,你可以轻松得到一个0到1之间的随机数:
#包括
#包括
#包括
主要的( )
{int 我;
srand( (无符号)时间( NULL ) );
for( i = 0; i < 10; i++ )
printf( "%5.2f\n", rand()/32767.0);
要生成 1 到 100 之间的随机数,可以这样写:
#包括
#包括
#包括
主要的( )
{int 我;
srand( (无符号)时间( NULL ) );
for( i = 0; i < 10; i++ )
printf("%d\n", rand()0+1);
二、三个通用随机数生成器,推荐第三个
函数名称: 兰特
功能:随机数生成器
用法:无效兰特(无效);
程序示例:
#包括
#包括
int 主函数(无效)
整数我;
printf("0到99的十个随机数\n\n");
对于(i=0;我
printf("%d\n", rand() % 100);
返回0;
函数名称:随机
功能:随机数生成器
用法: int random(int num);
程序示例:
#包括
#包括
#包括
/* 打印 0 到 99 范围内的随机数 */
int 主函数(无效)
随机化();
printf("0-99范围内的随机数:%d\n", random(100));
返回0;
函数名称:随机化更好!
功能:初始化随机数生成器
用法:无效随机化(无效);
程序示例:
#包括
#包括
#包括
int 主函数(无效)
整数我;
随机化();
printf("0到99的十个随机数\n\n");
对于(i=0;我
printf("%d\n", rand() % 100);
返回0;
随机数生成算法在《常用计算机算法》中有介绍
3. 如何生成设定范围内的随机数
由于rand生成的随机数范围是0到rand_max,而rand_max是一个非常大的数,那么如何生成从X到Y的数字呢?
从X到Y,有Y-X+1个数,所以要生成从X到Y的数,只需要这样写:
k=rand()%(Y-X+1)+X;
通过这种方式,您可以生成任何您想要的范围内的随机数。
四、生成不重复随机数
1)
#包括
#包括
#包括
#包括
swap(int *pm,int *pn)/*必须使用指针进行交换*/
国际温度;
温度=*下午;
*pm=*pn;
*pn=温度;
int 主函数(无效)
因蒂,a[513];
/*int *pa,*pb;*/
srand( (无符号)时间( NULL ) ); /*定义这个生成不同的随机数*/
for(i=1;i=1;i--)
/* pa=&a[i]; pb=&a[rand()%i+1];*/
swap(&a[i], &a[rand()%i+1]);/*加一是从1到i随机,不会包含0*/
/*不再需要定义指针了,所以结论是一样的*/
printf("\n");
对于(i=1;i