| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3796 人关注过本帖
标题:[求助]:如何产生5000个0-10000的互不相同的随机数
只看楼主 加入收藏
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
srand(time(NULL));

int a[10001],i,t;
for (i=0;i<=10000;i++) a[i] = 0;
for(i=1;i<=5000;i++)
{
t=rand()%10001;//保证产生10000以内的数
if(a[t]==0)
{
a[t]=1;
}
else //产生的相同数无效,所以会有5000个不同数产生.
{
i--;
}
}

/*楼主试下*/

倚天照海花无数,流水高山心自知。
2006-10-28 12:57
maoguoqing
Rank: 6Rank: 6
来 自:重庆
等 级:贵宾
威 望:28
帖 子:2980
专家分:19
注 册:2005-12-5
收藏
得分:0 
以下是引用nuciewth在2006-10-28 12:53:19的发言:

不能保证产生5000个数,因为当产生相同的数时,i也会增加.

请看仔细。。。。


天行健,君子以自强不息!!QQ:68660681
2006-10-28 14:13
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
for(i= 1;i<=5000;i++)
{
产生一个0--10000的随机数n;
while (a[n]) 产生一个0--10000的随机数n;//若n已经被产生就继续,
  a[n] = 1;//表示n被产生
}

a[n]==1时这个会不会死循环,当a[n]==0的时候怎么记录a[n]这个被选中.这样不是就浪费了一个i了.
请你把这段for循环代码完整的写下.可能我还没有领会你的意思.

倚天照海花无数,流水高山心自知。
2006-10-28 15:26
maoguoqing
Rank: 6Rank: 6
来 自:重庆
等 级:贵宾
威 望:28
帖 子:2980
专家分:19
注 册:2005-12-5
收藏
得分:0 
我还是写成代码算了:

for (i=0;i<=10000;i++) a[i] = 0;
for(i=1;i<=5000;i++)
{
n=rand()%10001;
while (a[n]) n=rand()%10001;//此句保证一定产生一个没有产生出来的数n
a[n]=1;
}

天行健,君子以自强不息!!QQ:68660681
2006-10-28 15:56
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
以下是引用maoguoqing在2006-10-28 15:56:02的发言:
我还是写成代码算了:

for (i=0;i<=10000;i++) a[i] = 0;
for(i=1;i<=5000;i++)
{
n=rand()%10001;
while (a[n]) n=rand()%10001;//此句保证一定产生一个没有产生出来的数n
a[n]=1;
}

怪自己太笨了,呵呵.这样写懂了好多.仔细分析了一下,觉得红色部分比较巧妙.
改成if()会比较好懂点.


倚天照海花无数,流水高山心自知。
2006-10-28 16:29
我不是郭靖
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:494
专家分:6
注 册:2006-10-4
收藏
得分:0 

两个程序效率都比较差,要是把题目改成
产生50000个0-50000的互不相同的随机数

可能算个几十分钟都没结果.


2006-10-28 16:40
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 
这样做效率很难控制,在极端的情形下如死机没什么两样.

[QUOTE]for(i=1;i<=5000;i++)
{
n=rand()%10001;
while (a[n]) n=rand()%10001;//此句保证一定产生一个没有产生出来的数n
//无法控制
a[n]=1;
}[/QUOTE]


int a[1000];

for (int i=0;i<10000;i++) a[i] = i+1;//初始化
for(int i=0;i<=10000;i++)//这里运行次数可控
{
int n=rand()%10000;
int tem = a[i];
a[i]=a[n];
a[n]=tem;
}

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2006-10-28 18:14
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 
最后得到的数组是一个1~10000随机数组,可随机取5000个,也可顺序取5000个

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2006-10-28 18:17
我不是郭靖
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:494
专家分:6
注 册:2006-10-4
收藏
得分:0 
以下是引用Knocker在2006-10-28 18:14:47的发言:
这样做效率很难控制,在极端的情形下如死机没什么两样.

for(i=1;i<=5000;i++)
{
n=rand()%10001;
while (a[n]) n=rand()%10001;//此句保证一定产生一个没有产生出来的数n
//无法控制
a[n]=1;
}



int a[1000];

for (int i=0;i<10000;i++) a[i] = i+1;//初始化
for(int i=0;i<=10000;i++)//这里运行次数可控
{
int n=rand()%10000;
int tem = a[i];
a[i]=a[n];
a[n]=tem;
}

其实你这种算法,也不是完全随机的.
也就是说某种情况的概率高,某种情况的概率低.

假如有1-n这n个数,它全排列有n!种,然后从这n!排列中随机抽取一种,这才算完全随机.
而你那个交换是达不到这种效果的.


2006-10-28 18:59
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 

那楼上请给个算法瞧瞧


九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2006-10-28 19:10
快速回复:[求助]:如何产生5000个0-10000的互不相同的随机数
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.050176 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved