2013-04-19 2 views
-1

Я в классе cs 2010. Никогда раньше не работали над кодированием или чем-то вроде этого. У меня хороший учитель, но у него очень толстый акцент, который трудно понять. Недавно он дал нам проект, который завершится через несколько дней. У меня были проблемы с получением последней части проекта.дублирует в произвольно сгенерированном массиве в Java

Проект просит вас создать 10 000 случайных чисел между 0-9999 и организовать их в массиве из 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

_ "Как вы можете видеть, это, в основном, прошу вас, чтобы сделать массив положил число 0-9999 в массиве в порядке наименьшего к наибольшему . Нет, я на самом деле не вижу. Где назначение подразумевает что-либо о заказе? –

+0

* «У меня хороший учитель, но у него очень толстый акцент, который трудно понять». * Общайтесь. электронной почты (или иначе в письменной форме). –

+2

10k случайных чисел, между '0 до 9999' & no repeat.Вам не нужно даже кода для этого! Просто заполните ваш массив цифрами от '0-9999', и все готово! – SudoRahul

ответ

2

Вместо генерироваться случайным образом 10000 чисел от 0 до 9999, генерировать 0 ... 9999 в порядке возрастания и shuffle массива. Убедитесь, что ваша перетасовка несмещена, например. что есть n! (если вы не уверены, стол проверяет его с n = 3, чтобы увидеть, является ли он объективным)

+0

Это решение. Так как это ассимиляция, она, вероятно, не сможет воспользоваться методом тасования. Итак ... Мне нужно написать свой собственный метод тасования, который должен быть довольно простым и должен быть хорошим учебным упражнением. – jahroy

+0

Благодарим за помощь, но, как вы можете видеть в комментариях, точными инструкциями является сортировка массива в порядке возрастания. Это меня сбивает с толку, поскольку я думаю, что это просто означало бы привести цифры 0-9999 по порядку в массив, но это кажется чрезвычайно простым для курса программирования. – user2297587

+0

@ пользователь2297587 Я не понимаю. Либо вы должны сортировать повторяющиеся случайные числа, либо произвольно перемешать случайные числа. (Или, возможно, перетасовать неповторяющиеся случайные числа, напечатать, ТОГДА сортировать, распечатать, чтобы продемонстрировать, что вы можете сделать оба?) – Patashu

2

Вы не можете генерировать 10000 случайных целых чисел в диапазоне 0-9999 без дубликатов, есть только 10000 тогда, так что вам нужно все.

Что вы можете сделать, это remrange, 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)); 

Знай свое оружие :)

+0

Можете ли вы, ребята, проверить мой код? for (int i = 0; i x [j]) { minIndex = j; } } if (minIndex! = I) { int temp = x [i]; x [i] = x [minIndex]; x [minIndex] = temp; }} } } – user2297587

+0

Arrays.asList не будет работать для ИНТ [] –

+0

@EvgeniyDorofeev: под Java 7, он только что сделал. Синтаксическая ошибка была, но в другом месте. – 9000

1

Если вы не хотите использовать в случайном порядке

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; 
} 
+0

Любые особые причины, по которым вы решили использовать цикл for? –

+0

@MarcoForberg никаких особых причин, я думаю, 'while' будет лучше подходит –

+0

Производительность будет по-прежнему плохая. Представьте себе последние несколько итераций, в которых большая часть чисел уже выполнена, и 'rand.nextInt()' не может создать подходящий номер почти постоянно. – 9000

0

Я написал (п) алгоритм вывода для решения этой проблемы проблема, вызванная книгой Программирование 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, в пределах которого х в положении х..

2, для числа J, случайным образом выбирать индекс из [J, N), это индекс,

3, поменять положение J от J до индекса, (экв поменять номер по индексу к позиция J)

4, петля J от 0 до к,

Смежные вопросы