Что я делаю не так с srand для создания неповторяющегося случайного массива в C ++? - PullRequest
0 голосов
/ 28 ноября 2011

Я пытаюсь создать случайный массив длины (size1).Способ, которым я исследовал это, состоит в том, чтобы иметь два отдельных массива, один для моих случайных чисел и вторичный «проверочный» массив, чтобы убедиться, что числа не повторяются.Они помечены (shuffle) и (visit) в моем коде соответственно.count1 - целое число для подсчета через цикл for.

Я включил следующее в различные комбинации, и оно не сработало.

    #include <ctime>
    #include <time.h>
    #include <cstdlib>

Код, с которым я, похоже, борюсь, этоэто:

    srand((unsigned)time(0));

for (count1 = 0; count1 < size1; count1++)
{
    num = (rand()%size1);
        if (visit[num] == 0)
        {
            visit[num] = 1;
            shuffle[count1] = num;
        }
}

Ответы [ 3 ]

3 голосов
/ 28 ноября 2011

Нет ничего плохого в том, что вы используете srand. Но описанная вами задача очень проста и не требует использования функции rand.

std::vector<int> v(size);
std::iota(v.begin(), v.end(), 0);
std::random_shuffle(v.begin(), v.end());

Если у вас нет функции iota, она просто генерирует возрастающую последовательность целых чисел.

2 голосов
/ 28 ноября 2011

Проще заполнить ваш массив числами от 0 до size1-1, а затем перетасовать эти числа.

Так в коде, похожем на c (давно не использовал c):

for (int count = 0; count < size1; count++) {
    shuffle[count] = count;
}

и затем перемешать его

for (int index = 0; index < size1; index++) {
    int shuffleIndex = index + rand() % (size1 - index);
    int temp = shuffle[shuffleIndex];
    shuffle[shuffleIndex] = shuffle[index];
    shuffle[index] = temp;
}

В основном, для первого элемента в массиве выберите любой индекс и переключите значения.Теперь первый индекс выбран случайным образом.Для второго элемента выберите случайный индекс (исключая первый, который уже был выбран случайным образом) и сделайте то же самое.Повторяйте, пока не дойдете до последнего элемента.

1 голос
/ 28 ноября 2011

Ваши #include s не проблема.Проблема в том, что вы не пытаетесь сгенерировать альтернативные числа, если первое, которое вы сгенерировали, уже используется.

Вы должны включить цикл while внутри цикла for, который продолжает генерировать новые числа, пока вынайдите тот, который работает.

Они так, как написано сейчас, если вы сгенерируете последовательность 4,1,4,2,4 для size1 = 5, ваш массив будет выглядеть так:Предполагая, что каждая запись изначально была установлена ​​на 0.Это потому, что вы просто пропустите индексы, для которых были сгенерированы два дополнительных 4.

...