当前位置: 代码迷 >> 数据结构与算法 >> 1~1000范围的有限的随机数产生的有关问题
  详细解决方案

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

热度:387   发布时间:2016-05-23 09:13:59.0
1~1000范围的有限的随机数产生的问题
在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时,程序总是不停的产生数并判断该数已经产生过,然后继续重复上述步骤。

想请教如何改变算法,让产生过程更快。

------解决方案--------------------
为什么只有那个区间有这个问题,难道[1,5]等没有马?

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

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

我知道我说的对不对?


------解决方案--------------------
以下示例假设N=1000

用一个列表,把1到1000的数存起来,随机从所有数中取出一个,后面的数前移,列表的元素数量减1,如此重复。

------解决方案--------------------
给你写了个,速度还可以,一秒钟不到,就出来了。
#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的元素位置输出即可。
------解决方案--------------------
用洗牌算法
定义一个数组,里面是顺序排好的自然数
把随机一个数组元素和第一个元素交换
把随机一个数组元素和第二个元素交换
把随机一个数组元素和第三个元素交换
……
把随机一个数组元素和第N个元素交换
这里N为需要生成的不重复随机数个数
------解决方案--------------------
随机洗牌算法。

代码:

/*
&Euml;&aelig;&raquo;ú&Iuml;&acute;&Aring;&AElig;&Euml;&atilde;·¨
±à&sup3;&Igrave;&raquo;·&frac34;&sup3;: 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 < < "&Ccedil;&euml;&Ecirc;&auml;&Egrave;&euml;N (N <1000) : ";
cin> > n;
Random_Shuffle( n );
return 0;
}
  相关解决方案
本站暂不开放注册!
内测阶段只得通过邀请码进行注册!
 
  • 最近登录:Tue Oct 24 06:41:50 CST 2017
  • 最近登录:Tue Oct 24 06:41:50 CST 2017
  • 最近登录:Tue Oct 24 06:41:50 CST 2017
  • 最近登录:Tue Oct 24 06:41:50 CST 2017
  • 最近登录:Tue Oct 24 06:41:50 CST 2017