思路如下,首先使用一个数组作为存储所有可能值的容器集合,然后通过循环每次生成一个随机值,这个值将来会作为下标来访问容器集合中的数值。因为数组是不可变集合,我们不能将已经使用数值从数组中删除,并且它们是简单的数据类型我们不可能给每个数值增加一个属性表示数值是否已经被使用过了,那该怎么办呢?办法就是每次从可用的下标集合中随机生成一个值,然后以这个值作为索引从容器集合中得到相应的值保存到结果集合中,除此之外再将这个已经使用过的值与数组中最后一个没有使用到的值互换位置,然后下一轮再在所有没有使用过的值中重新再取一个值。代码如下:
public int[] GenerateNumber3() { //用于存放1到33这33个数 int[] container = new int[33]; //用于保存返回结果 int[] result = new int[6]; Random random = new Random(); for (int i = 1; i <= 33; i++) { container[i - 1] = i; } int index = 0; int value = 0; for (int i = 0; i < 6; i++) { //从[1,container.Count + 1)中取一个随机值,保证这个值不会超过container的元素个数 index = random.Next(1, container.Length-1-i); //以随机生成的值作为索引取container中的值 value = container[index]; //将随机取得值的放到结果集合中 result=value; //将队列对应的值移到队列中 container[index] = container[container.Length - i-1]; //将刚刚使用到的从容器集合中移到末尾去 container[container.Length - i-1] = value; } //result.Sort();排序 return result; } 这样一来,问题得到了解决了。这种做法也可以移植到不支持泛型的版本或者语言当中。 |
|