1~1000范围的有限的随机数产生的问题

kid5 2007-06-17 10:23:02
在1~1000产生N个随机数(N为用户指定, N大于0,不大于1000),产生出来的数,不能重复,如N=3时,结果可以是1,202,454;但不能为34,43,43。

我现在的实现是,如果N=1000时,顺序产生全部的1~1000。

如果N<1000,则随机产生数,同时进行重复数过滤。

现在问题是当900<N<1000,特别是995<N<1000时,程序总是不停的产生数并判断该数已经产生过,然后继续重复上述步骤。

想请教如何改变算法,让产生过程更快。
...全文
560 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
vc_asm 2007-06-19
  • 打赏
  • 举报
回复
和jiangsheng(蒋晟.Net[MVP]) 的方法不谋而合
vc_asm 2007-06-19
  • 打赏
  • 举报
回复
产生1-1000顺序放入数组中,假设需要N个随机数,则产生一个1-1000的随机数r1,把第一个元素和第r1个随机数交换,再产生一个随机数r2,把第二个元素和第r2个元素交换...把第N个元素和第rN个元素交换,把前N个数字输出即可。
kingbdmw 2007-06-19
  • 打赏
  • 举报
回复
995<N<1000
是5/1000的几率!虽然总能排带!但是太慢了
不如直接对1000个数的数组进行随机排序!

用洗牌算法(我自己的思路,大家不要笑)
随机2个数a 和b,将数组中index=a 到index=b之间的所有数一起放到数组的前面或者后面!
循环多次就行了
chzuping 2007-06-17
  • 打赏
  • 举报
回复
给你写了个,速度还可以,一秒钟不到,就出来了。
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
int find(int *a,int num,int data);
void main()
{
int a[1000]={0},temp,n;
int i,j,k;
printf("please input zhe number of data:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
srand(time(NULL));
temp=rand()%(1000-i)+1;

for(j=0,k=0;j<temp;)
{if(a[k++]==0)
j++;
}
a[k-1]=1;
}
for(i=1;i<=1000;i++)
if(a[i-1]==1)
printf("%4d",i);
}
程序的思想是这样的:
用一个标志数组a[1000],加入产生的数为123,则将a[122]置为1,产生n个数后,把下一个随机数(假设为next)的范围定为1000-n,由于此时数组a还有1000-n元素没有置为1,此时可以把next对应的空位置为1,这样一直循环,直到产生所需数为止。
最后扫描整个数组a,把值为1的元素位置输出即可。
ahjoe 2007-06-17
  • 打赏
  • 举报
回复
以下示例假设N=1000

用一个列表,把1到1000的数存起来,随机从所有数中取出一个,后面的数前移,列表的元素数量减1,如此重复。
uzone 2007-06-17
  • 打赏
  • 举报
回复
另外,

“如果N<1000,则随机产生数,同时进行重复数过滤。”

这样做好像效率很低吧,应该会有更好的方法的。


uzone 2007-06-17
  • 打赏
  • 举报
回复
为什么只有那个区间有这个问题,难道[1,5]等没有马?

如果当区间很小的时候[min,max]可以在[1,max-min+1]的区间上产生几个数

再加上min就应该可以乐吧?

我知道我说的对不对?

kid5 2007-06-17
  • 打赏
  • 举报
回复
非常感谢大家提供这些方法,我下去试一试
medie2005 2007-06-17
  • 打赏
  • 举报
回复
粗心了。
我的代码中Random_Shuffle()中的第二个for循环,只需要执行n次。

应该改为:

for( i=0; i<n; ++i ){
j=rand()%1000;
swap( list[i], list[j] );
}
chzuping 2007-06-17
  • 打赏
  • 举报
回复
楼主的算法不错,效率也不错,比我的好。
medie2005 2007-06-17
  • 打赏
  • 举报
回复
??

代码中的中文成乱码了?
medie2005 2007-06-17
  • 打赏
  • 举报
回复
随机洗牌算法。

代码:

/*
Ëæ»úÏ´ÅÆËã·¨
±à³Ì»·¾³: VC6.0
*/
#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;

void Random_Shuffle( int n )
{
int list[1000];
int i;
for( i=0; i<1000; ++i )
list[i]=i+1;
srand(time(NULL));
int j;
for( i=0; i<1000; ++i ){
j=rand()%1000;
swap( list[i], list[j] );
}
for( i=0; i<n; ++i )
cout<<list[i]<<" ";
cout<<endl;
}

int main( )
{
int n;
cout<<"ÇëÊäÈëN (N<1000) : ";
cin>>n;
Random_Shuffle( n );
return 0;
}
蒋晟 2007-06-17
  • 打赏
  • 举报
回复
用洗牌算法
定义一个数组,里面是顺序排好的自然数
把随机一个数组元素和第一个元素交换
把随机一个数组元素和第二个元素交换
把随机一个数组元素和第三个元素交换
……
把随机一个数组元素和第N个元素交换
这里N为需要生成的不重复随机数个数
uzone 2007-06-17
  • 打赏
  • 举报
回复
不好意思

我把题目理解错了


不知道搂住是用什么方法做的


楼上的做法是很不错的,个人认为;)

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧