2013-11-07 3 views
0

Просто хочу начать извиняться, если на это был дан ответ, и нужно просто сформулировать его по-другому, поэтому я не смог его найти. Я работаю над этой конкретной проблемой в течение нескольких часов, и, возможно, мой Google Fu слаб.Сравните все элементы в пределах одного массива

Для моего класса C++ я должен создать генератор случайных чисел, который собирает данные от пользователя, чтобы указать количество цифр, которые должны быть номера, и количество создаваемых rands. Я могу создать randoms просто отлично, единственная проблема состоит в том, что числа не могут дублироваться в любой момент, а цикл if, который я создал в конце, чтобы уменьшить, возвращает true всегда, и я не могу понять, почему. Из-за этого цикл никогда не переходит к увеличению i. Если я не ошибаюсь, не должно быть даже возможности иметь двойную запись с первой попытки?

void TargetGen::genNumbers() 
{ 
    int mod = 0; 
    int baseMod = 0; 

    if(Digits != 1) 
    { 
     baseMod = pow(10.0,(Digits -1)); 
    } 
    mod = (pow(10.0,Digits))-baseMod; 


    for(int i=0;i<Numbers;i++) 
    { 
     cout << "front of i loop, value of i: " << i << endl; 
     int randomTemp; 

     randomTemp = rand() % mod + baseMod; 

     targets[i] = randomTemp; 
     cout << "rand: " << targets[i] << endl; 
     for(int k = 0;k <= Numbers; k++) 
     { 
      if(targets[k] == targets[i]) 
      { 
       cout << targets[i] << endl; 
       i--; 
      } 
      cout << " k looping, k value: " << k << endl; 
      cout << " k loop, value of i: " << i << endl; 

     } 
    } 
} 
+0

Самый простой способ избежать дублирования и не хранить все числа в памяти - использовать порядковые номера 1,2, .. N и шифровать каждый с помощью любого симметричного блока cypher, например DES. Поскольку число может быть дешифровано обратно, тогда невозможно иметь 2 разных входа, карты которых соответствуют одной и той же криптограмме. – maxihatop

+0

Возможный дубликат [Алгоритм для выбора одной случайной комбинации значений?] (Http://stackoverflow.com/questions/2394246/algorithm-to-select-a-single-random-combination-of-values) –

+0

Сделать 'target' a' std :: set' и продолжайте добавлять случайные числа, пока не достигнете нужного размера. –

ответ

0

Вы инициализировали «цели» в любом месте? Я немного слаб в C++ (я не кодировал его в годах), но я не вижу, чтобы это было объявлено где-то ... поэтому я предполагаю, что он всегда возвращает true, потому что цели не инициализируются нигде Я мог ошибаться.

+0

Если он не был объявлен, код не будет компилироваться. Похоже, что это атрибут класса. –

+0

ahhh, что имеет смысл.Это то, что я получаю для кодирования в python слишком долго> __ < – deweyredman

0

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

0

Я предлагаю вам следовать рекомендациям Zac Howland из комментариев, используйте вектор set вместо вектора и продолжайте проверять размер, или, вернее, вставлена ​​ли вставка. Что-то вроде:

int insertedNumbers = 0; 
set<int> targets; 
while (insertedNumbers != Numbers) { 
    int randomTemp = rand() % mod + baseMod; 

    pair<set<int>::iterator, bool> insertionResult = targets.insert(randomTemp); 

    if(insertionResult.second) insertedNumbers ++; 
} 

cout << "Random numbers:" << targets.size() << endl; // Should equal Numbers 
0

У меня есть несколько предложений для вас:

1) рандов() обычно требует посева. Если каждый раз, когда вы запускаете его, вы получаете одинаковый номер, вы, вероятно, забываете посеять: http://www.cplusplus.com/reference/cstdlib/rand/

2) Если вы не можете повторить произвольные числа, которые вы генерируете, и вы не создаете невероятно большое количество из них, вы можете поместить каждый результат в набор или отсортированный список. Таким образом, вы можете просто проверить, что вы знаете, что создали.

3) Обычно номера будут указывать класс, поскольку N капитализируется. Используйте numberOfNumbers, если нужно, это более ясное имя переменной.

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