我参加了2010年的cs班。从来没有在编码之前或之类的任何工作。我有一位老师,但他的口音非常浓重,很难理解。他最近给了我们一个项目,要完成几天。我在完成项目的最后一部分时遇到了问题。
项目要求您在0-9999之间生成10,000个随机数,并将它们排列在10,000个数字的数组中,而不重复任何数字。正如您所看到的,这基本上是要求您使数组按照从最小到最大的顺序将数字0-9999放在数组中。我的问题是不重复的数字。我一直在研究代码超过4个小时,试图找出如何让它不重复,没有运气。我在网上搜索了至少一个小时,所有其他提示或解决方案都没有帮助。这是我到目前为止的代码,有人可以帮助我吗?
package array.sorter.project;
import java.util.Arrays;
import java.util.Random;
public class Sorting {
public static void main(String args[]){
int[] randomNumbers = new int[10000];
Random rand = new Random();{
for (int i = 1; i < randomNumbers.length; i++) {
int n = rand.nextInt(10000);
randomNumbers[i] = n;}
for (int i = 0; i < randomNumbers.length; i++) {
int smallestNo = randomNumbers[i];
int posWithSmallest = i;
for (int j = i+1; j < randomNumbers.length; j++) {
int val = randomNumbers[j];
if (val < smallestNo) {
smallestNo = val;
posWithSmallest = j;
}
}
int tmp = randomNumbers[i];
randomNumbers[i] = smallestNo;
randomNumbers[posWithSmallest] = tmp;
}
Arrays.sort(randomNumbers);
for (int i = 0; i < randomNumbers.length; i++) {
System.out.println("Position " + i + " : " + randomNumbers[i]);
}
}
}
}
答案 0 :(得分:2)
不是从0到9999随机生成10000个数字,而是按升序生成0 ... 9999并生成shuffle数组。确保您的改组不偏不倚,例如有n!它可以完成的方式(如果你不确定,桌面检查n = 3,看它是否是无偏见的)
答案 1 :(得分:2)
你不能在没有重复的情况下在0-9999范围内生成10000 随机整数,那时只有10000,所以你需要全部。
您可以做的是重新排列,shuffle。
所以:
import java.util.Collections;
import java.util.Arrays;
...
int[] ten_thousand = new int[10000];
for (int i=0; i < 10000; i+=1) ten_thousand[i] = i;
return Collections.shuffle(Arrays.asList(ten_thousand));
了解你的武器:)
答案 2 :(得分:1)
如果你不想使用shuffle
private static int[] generateRandom(int count) {
int[] randomNumbers = new int[count];
Set<Integer> checker = new HashSet<Integer>();
Random rand = new Random();
for (int i = 0; i < count;) {
int nextInt = rand.nextInt(count);
if (!checker.contains(nextInt)) {
randomNumbers[i++] = nextInt;
checker.add(nextInt);
}
}
return randomNumbers;
}
答案 3 :(得分:0)
我已经编写了一个O(n)算法来解决这个问题的灵感来自本书 Programming Pearls,2nd Edition 。代码如下:我将在稍后解释:
/**
* randomly select k numbers in [0,n),and sort them in random order.(k<=n)
*/
public static int[] getRandomArray(int n, int k) {
if (k > n) {
k = n;
}
int[] rets = new int[k]; // store the random ordered number
int[] array = new int[n];// original array that array[i] is i
for (int i = 0; i < n; i++)
array[i] = i;
Random random = new Random();
for (int j = 0; j < k; j++) {
// generate a random number between [j,n) as index
int index = j + random.nextInt(n - j);
// swap array[j] and array[index],so array[0..j] are all non-repeat
// random number
int temp = array[index];
array[index] = array[j];
array[j] = temp;
// store it in rets
rets[j] = temp;
}
return rets;
}
解释
to generate non-repeating 10,000 random numbers between 0-9999
可以被视为 以随机顺序排列数字0-9999 。
在图1中,k数存储在array
中,其中x位于x。
2,对于数字j,从[j,n)中随机选择一个索引,即索引,
3,将j的位置从j交换到索引,(e.q。将索引处的数字交换到位置j)
4,循环j从0到k,