如何循环十次就产生10个1-100不重复的随机数,最好用C或者说出代码思想

问题描述:

如何循环十次就产生10个1-100不重复的随机数,最好用C,lua或者说出代码思想,跪求大神

假设需要的数范围是 n,需要输出m个不重复的数,理想情况是算法的时间复杂度为O(m)
算法如下:
1. 建立一个数组大小为 n 的数组 arr,分别存放 1 到 n 的数值;
2. 生成一个从 0 到 n - 1 的随机数 x;
3. 输出 arr 下标为 x 的数值,即为第一个随机数;
4. 将 arr 的尾元素和下标为 x 的元素互换;
5. 同2,生成一个从 0 到 n - 2 的随机数 x;
6. 输出 arr 下标为 x 的数值,为第二个随机数;
7. 将 arr 的倒数第二个元素和下标为 x 的元素互换;
……
如上,直到输出 m 个数为止

我告诉你思路,先准备一个集合。for循环10次,每次生成一个随机数a,遍历集合里面的数据(当然第一次集合是空的),如果集合中的数等于a或者a等于0 再生成一个随机数赋给a 当遍历集合中的数完后(也就是集合里面的数不重复了),就把a添加进去
这样重复10次,就会产生10个不重复的数并且在1-100了。我不知道怎么用c写。我用我熟悉的语言写了一个,并测试没有问题。你可以参考下

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class Demo {
public static void main(String[] args){
Random rand=new Random();
Listlists=new ArrayList();
for(int i=0;i<10;i++){

int a=rand.nextInt(100);
for(int j=0;j<lists.size();j++){
if(Integer.parseInt(lists.get(j))==a || a==0){
a=rand.nextInt(100);
}
}
lists.add(a+"");
}

    for(String str:lists){
        System.out.print(str+"\t");
    }
}

}

(Int)(Math.random()*100+1)

循环里面加判断,等于就重新生成

用time函数生成随机种子不就好了

#include
#include
#include

//time()
//语法 :
//
//
//#include
//time_t time(time_t *time);
//
//
//功能: 函数返回当前时间,如果发生错误返回零。如果给定参数time ,那么当前时间存储到参数time中

//srand()
//语法 :
//
//#include void srand( unsigned seed );
//功能: 设置rand()随机序列种子。对于给定的种子seed, rand()会反复产生特定的随机序列。
//

//rand()
//语法 :
//
//#include int rand( void );
//功能: 函数返回一个在零到RAND_MAX 之间的伪随机整数

//rand()函数是生成一个随机数。随机数的范围是0到RAND_MAX之间的数。
//srand()函数是生成一个随机种子,如果不设置随机种子,则使用rand()函数前默认添加了函数srand(1)。这样你每次运行程序,生成的10个随机数都是一样的。
//如果你设置srand(11),虽然生成了另外的一组随机数,但也同样,每次运行函数都是生成同样的随机数。
//time()函数,它根据当前时间返回一个整型值。time(NULL)是一个int型数据,根据当前时间生成的int数。
//srand(time(NULL)),就能根据每次开始运行程序的时间,生成不同的随机种子。这样每次运行的程序都会生成不同的随机数列。

int main()
{
srand(time(NULL));
int a;
for (int i = 0;i < 10;i++)
{
a = rand() % 100 + 1; //rand()%100, 随机数的大小是0-100, rand()%100+1,a的范围是1-100;
printf("%d ",a);
}

return 0;

}