如何用C语言从固定的一些数中产生随机数?

一副扑克牌,除去大、小王和4个A,从剩余48张扑克牌中每次随机产生一个数,48张牌具有唯一性,也就是出现一次后就不再出现了。换句话说就是模拟发牌的过程,一张牌肯定是不能发两次的。

楼上的有问题,很可能相当长的时间才能完成一次随机,运气不好一天都完不成一次

/* 我自己想的一个方法:

1,数组flag[48],表示48个数是否被选中,初始化为0,表示未被选中。
2,srand(),rand()得到一个随机数m。
3,然后得到我们需要的随机数。第一次是m%48+1,第二次是m%47+1,第三次是m%46+1,...,最后一个不需要随机了。
4,每次获取随机数后,这个随机数表示第几个未被选中的数,每次选中后将flag标志置1。

*/
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main()
{
int Num = 48; // 需要随机的次数
// 选中标志
int Flag[48] ={0}; // 标记是否已经被随机
// 输出数据
int bufArr[48]={0}; // 保存随机后的数据
int i = 0;
int j = 0;
int Rand_num = 0; // 保存中间随机到的数据
int Rand_max = 0; // 保存当前存在的数据数量
Rand_max = Num;

srand(time(0));
// 产生随机数
for(i = 0; i < Num; i++)
{
Rand_num = rand()%Rand_max + 1; // 获取随机数Rand_num
for(j = 0; j < Num; j++) // 遍历所有数据
{
if(!Flag[j]) // 判断该数据是否已经随机
Rand_num--;
if(!Rand_num) // 判断是否数到第Rand_num个没有标记的数据
break;
}
bufArr[i] = j+1; // 获取结果,第Rand_num个没有标记的数据
Flag[j] = 1; // 置获取标志
Rand_max--; // 需要随机的数减少一个
}
// 每次都不一样
for(i = 0; i < Num; i++)
{
if(i%8 == 0)
printf("\n");
printf("%5d", bufArr[i]);
}
printf("\n");

return 0;
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-10-10
//如何用C语言从固定的一些数中产生随机数
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
bool flag[49]={0},f=true;
int i,count=0;
srand((unsigned int)time(0));
while(f)
{
i=rand()%48+1;
if(flag[i]==0)
{
printf("%d\n",i);
flag[i]=1;
count++;
if(count==48) f=0;
}
}
return 0;
}

使用标记数组,这种技巧很常用本回答被网友采纳
相似回答
大家正在搜