2013-07-25 4 views
-1

Это может быть непростым для некоторых, но я пытаюсь проверить, есть ли в моем коде какие-либо повторяющиеся значения.Как выполнить двойную проверку кода?

Чтобы быть яснее, я создаю 5 переменных Целые числа, которые рандомизируют число после их создания. Предположим, что они названы i1, i2, i3, i4, i5.

Я хочу запустить цикл, чтобы проверять друг друга, чтобы убедиться, что у них нет возможных дубликатов. Если они это сделают, я буду повторно случайнымsecond Integer, который проверяется. (например, if (i1 == i4) { i4.rand(); }) Чтобы убедиться, что не требуется повторно проверять все ранее проверенные значения или застревать в длинном цикле до тех пор, пока не будет найдено другое число.

Это то, что я имею в виду, если она была целой, если другое заявление: if (i1 == i2), if (i1 == i3), if (i1 == i4), if (i1 == i5), if (i2 == i3), if (i2 == i4), if (i2 == i5), if (i3 == i4), if (i3 == i5), if (i4 == i5)

Я знаю, что, вероятно, может сделать это «вручную», создав множество заявлений if/else, но есть ли лучший способ сделать это? Вероятно, это не очень возможно, если я увеличу свой предел Integer до 20, и мне нужно сделать if/else мой путь через 20 проверок стоимости. Я знаю, что есть, но я просто не могу вспомнить. Поиск в Google ничего не вызывает (может быть, я искал неправильные ключевые слова), поэтому я спрашиваю здесь, в StackOverflow.

Все, что я хочу знать, это как это сделать, theory-wise (как бы вы проверяли на дубликаты в теории?). Ответ не обязательно должен быть работоспособной функцией.

Если вы хотите создать демо-код, используя язык программирования, который я использую для этой проблемы, его Excel VBA. Но я думаю, что эта информация сможет применить теорию к множеству других языков программирования, поэтому не стесняйтесь писать в javascript/jQuery, C++, C# и т. Д. Просто помните, чтобы комментировать!

+0

Я думаю, вы имеете в виду дубликаты 'values', а не переменные. В любом случае, как вы начинаете создавать случайные числа? –

+0

um, функция random(), предоставляемая большинством языков программирования - Excel VBA имеет Rand(). –

+0

Как и прежде, сначала производителю, затем проверяйте дубликаты. –

ответ

4

Вы ищете Набор;

Set<Integer> hs = new HashSet<Integer>(); 
    hs.add(i1); 
    if(!hs.add(i2)){ 
     randomize(i2); 
    } 

Надеюсь, это поможет. Дайте знать, если у вас появятся вопросы. Выше приведена только концепция того, что делать.

Чтобы получить логику для вашего кода, то это будет

Set<Integer> hs = new HashSet<Integer>(); 

    for(int count=0; count<Array.length; count++){ // Store the data into the array and loop 
     dataToInsert = Array[count]; 

     while(hs.add(dataToInsert)){ 
      dataToInsert = randomize(dataToInsert); 
     } 
    } 
+1

Чтобы справиться с этим решением, вы, вероятно, захотите использовать 'do {randomize (x)} while (! Hs.Add (x))' вместо блока 'if' в его нынешнем виде. –

+0

справа, цикл 'for'. Поэтому я должен сначала поместить все переменные в массив ... затем запустить цикл? Любая идея, что эквивалентно .add в VBA? Или это VBA? Я смущен. –

+0

Да, сначала поместите элементы в массив, а затем выполните цикл через массив. Код выше находится на Java. Это тоже будет работать на C#. – JNL

0

Что вы можете сделать, это цикл по List<int> и для каждого элемента x по индексу i, время цикла list.Take(i-1).Contains(x) и заменить x с новым случайное число.

Если вы просто хотели относительно недорогой чека, что данный List<int> полон уникальных номеров, однако, вы могли бы сделать что-то вроде:

bool areAllUnique = list.Count() != list.Distinct().Count()` 
0

Псевдо-код:

  1. Создать пустой set S.
  2. Сгенерировать псевдослучайное число r.
  3. Если r в S, перейти к этапу 2. В противном случае, перейдите к 4.
  4. Добавить R к S.
  5. Если есть еще переменные для инициализации, перейти к этапу 2.

Примерные реализации в Java:

public static void main(String[] args) 
{ 
    System.out.println(getUniqueRandoms(5, 10)); 
} 

public static Set<Integer> getUniqueRandoms(int howMany, int max) 
{ 
    final Set<Integer> uniqueRandoms = new HashSet<Integer>(howMany); 
    while (uniqueRandoms.size() < howMany) 
    { 
     uniqueRandoms.add((int) (Math.random() * max)); 
    } 
    return uniqueRandoms; 
} 

Выход:

[8, 2, 5, 6, 7] 

Если вы хотите иметь их в массиве, а не в Set, просто позвоните toArray() на свой набор.

2

Вот простой способ получить целые числа предполагая, что вы хотите, чтобы генерировать их в диапазоне от 1 до N

Сформировать целое число от 1: N Сформировать целое число от 1: N-1 Генерирует целое число от 1: N-2 Генерировать целое число от 1: N- (k-1)

Теперь интерпретируйте их как позицию целого числа, которое вы сгенерировали (в наборе общих доступных целых чисел для этого числа) и постройте свое реальное целое число.

Example, N = 5, k=4 
3 
1 
2 
2 

i1 = 3 
i2 = 1 
i3 = 4 (the available integers are 2 4 5) 
i4 = 5 

Обратите внимание, что для этого требуется минимальное количество генераций случайных чисел.

0
HashSet<Integer> set = new HashSet<Integer>(); 
for(int i = 0; i < 5; i++) 
{ 
    int x; 
    do 
    { 
     x = random(); 
    } 
    while(!set.Add(x)); 
} 

    int i1 = set.ElementAt(0), 
     i2 = set.ElementAt(1), 
     i3 = set.ElementAt(2), 
     i4 = set.ElementAt(3), 
     i5 = set.ElementAt(4); 
0

2 способа, о которых я могу думать.

1: Зацикливание всех значений в вашем наборе и сравнение каждого с тем, что вы добавляете.

2: Создание упрощенной версии хэш-карта:

var set 
var map_size 
create_set(n): 
    set <- array of size n of empty lists 
    map_size <- n 

add_number(num_to_add): 
    if num_to_add not in set[num_to_add % map_size]: 
     add num_to_add to set[num_to_add % map_size] 
     return success 
    else: 
     return failure 

populate_set(): 
    loop 5 times: 
     i <- random_number() 
     while(add_number(i) == failure): 
      i <- random_number() 

Таким образом, каждый раз, когда вы добавляете номер, вместо проверки против любого другого числа в наборе, вы только проверка против на большинство [max value of integer]/[map size] значений. И в среднем [number of elements in set]/[map size] (я думаю, исправьте меня, если я ошибаюсь).

0

Попробуйте

ArrayList<Integer> list = new ArrayList<Integer>(); 

while (list.size() < 5) 
{ 
    int i = Math.random() * max; 
    if (!list.contains(i)) 
    { 
     list.add(i); 
    } 
} 

и вы получили в list 5 различных Целые.

1

Чтобы понять, что вы пытаетесь, это неправильный подход.Теоретически, проверка дубликатов и «повторная рандомизация» при обнаружении, может выполняться бесконечно долго, поскольку существующие целые числа могут быть постоянно выбраны.

Что вы должны делать, так это построить коллекцию целых чисел таким образом, чтобы вначале не было дубликатов. Ответ Денниса Джаруддина делает это. В качестве альтернативы, если у вас есть определенный набор целых чисел на выбор (например, 1-20), и вы просто хотите их в произвольном порядке, вы должны использовать shuffling algorithm. В любом случае, вы должны начать с поиска существующих реализаций на вашем языке, поскольку это почти наверняка было сделано раньше.

+0

Я понял из-за того, что почти каждый ответ основывался на том, что вы только что написали: «таким образом, чтобы вначале не было дубликатов». –

+0

@RenoYeo На самом деле большинство из них, похоже, имеют одинаковую проблему: они выбирают случайное значение и проверяют, было ли оно уже выбрано, что может произойти любое количество раз до того, как будет выбрано поистине уникальное значение. – nmclean

+0

ммм. То, что я действительно не получаю, это код Денниса - диапазон от 1: N, допустим, что N равно 5 ... так что если генератор генерирует 4, не будет ли следующий доступный шаг (1: N-1) в возможном диапазоне только 1 - 4 и, возможно, возможность получить дубликат того, что было создано на первом этапе? –

0

В R довольно просто ...

i <- as.integer(runif(5, 1, 10)) 

for(l in seq_along(i)){ 
    while(any(i[l]==i[-l])) # checks each against all the other 
    i[l] <- as.integer(runif(1, 1, 10)) 
} 

Однако в R есть функция sample, которая выбирает случайные элементы из данного вектора без дубликатов (даже если вы можете иметь их)

> sample(1:10, 5) 
[1] 2 5 1 9 6 
> sample(1:10, 5) 
[1] 3 5 8 2 1 
> sample(1:10, 5) 
[1] 8 3 5 9 4 
> sample(1:10, 5) 
[1] 1 8 9 10 5 
Смежные вопросы