生成不重复的随机数 - 常考面试题
2011-09-27 09:36
267 查看
#include<iostream>
#include<time.h>
#define N 100
int a
;//结果数组
void swap(int& i,int& j)
{
int temp=i;
i=j;
j=temp;
}
int main()
{
int i=0;
for(i=1; i<=N; i++)
{
a[i]=i;
}
srand(unsigned(time(NULL)));
for(i=N-1; i>0; i--)
{
swap(a[i], a[rand()%i]);
}
return 0;
}
解决思路:
这个问题的实际应用就比如要随机生成一副扑克牌,54张,顺序是乱的,但显然牌面不能重复。用随机数生成器生成的数总是会重复的,所以,不能把生成的数直接保存下来作为结果。那么怎么办?
你想想,如果是真实的扑克牌,你是怎么打乱的?你会说:洗牌啊!没错,就是洗牌!洗牌是什么过程?说白了,是交换!把两摞牌交换位置,用类似的方法就可以解决楼主的问题。
先按顺序在数组里生成1-100的数,然后产生一对0-99之间的随机数,把这两个数所表示下标的数交换位置,如此重复几十次,原先的数组就被打乱了。
#include<time.h>
#define N 100
int a
;//结果数组
void swap(int& i,int& j)
{
int temp=i;
i=j;
j=temp;
}
int main()
{
int i=0;
for(i=1; i<=N; i++)
{
a[i]=i;
}
srand(unsigned(time(NULL)));
for(i=N-1; i>0; i--)
{
swap(a[i], a[rand()%i]);
}
return 0;
}
解决思路:
这个问题的实际应用就比如要随机生成一副扑克牌,54张,顺序是乱的,但显然牌面不能重复。用随机数生成器生成的数总是会重复的,所以,不能把生成的数直接保存下来作为结果。那么怎么办?
你想想,如果是真实的扑克牌,你是怎么打乱的?你会说:洗牌啊!没错,就是洗牌!洗牌是什么过程?说白了,是交换!把两摞牌交换位置,用类似的方法就可以解决楼主的问题。
先按顺序在数组里生成1-100的数,然后产生一对0-99之间的随机数,把这两个数所表示下标的数交换位置,如此重复几十次,原先的数组就被打乱了。
相关文章推荐
- [转]生成不重复的随机数 - 常考面试题
- 生成不重复的随机数
- 随机生成不重复的随机数的简单算法
- 生成四位随机数,数字不重复
- java随机生成6/8/12位数,要求每次产生的随机数与已生成的随机数不重复
- PHP生成不重复随机数的方法汇总
- 用C#生成不重复的随机数
- java生成不重复的随机数
- 关于C++随机数生成中种子值设置的一点总结,解决随机数序列重复问题
- 生成不重复随机数
- c#生成不重复随机数
- 写一个彩票程序 30选7 随机(1~30中间)生成7个随机数,注意不能重复然后输入7个数,对比7个数是否与随机数有相同的,如果有显示“中了几个号” 如果中了7个号,显示一等奖 如果中了6个号,显示二
- C++批量生成大规模随机数中种子值设置的总结——解决随机数序列重复问题
- 数组生成序列不重复随机数
- 生成四位不重复随机数
- 生成5个不重复的随机数
- 生成不重复的随机数
- 多线程中生成随机数序列重复问题的解决方法
- C#生成不重复的随机数
- 如何生成1-10之间不重复的随机数