О неповторяющейся функции ранда - PullRequest
0 голосов
/ 04 марта 2019

Я попытался сгенерировать 25 массивов, каждый из которых должен содержать числа от 1 до 25 без повторений и не по порядку.Я выполнил код для генерации массива, повторений не было.Когда я пытался отобразить массив в 2D-массив, в массиве были повторяющиеся числа.

Вот мой код

int permutation(int arraystore[]){

int item[25], index;
for (int x = 0; x < 25; x++)
    item[x] = x;                  //input values into item array

for (int x = 25; x > 0; x--) {
    index = rand() % x;     //generate random numbers
    arraystore[x] = item[index];
    while (index < x - 1) {             
        item[index] = item[index + 1];
        index++;
        }
    }
}

Я сопоставляю массив с массивом 2d в main

int main(){
int ddarray[25][25];
for(int j=0;j<25)
    for(int i=0;i<25;i++){
        int array[25];
        permutation(array);
        ddarray[j][i]=array[i];
    }
}

Вот некоторые результаты

192, 9 , 7 , 3, 11 , 20,18, 9 23 11 , 21,5, * +1021 * 11 * * тысяча двадцать два, 17,5,12, 11 , 3,10 * тысяча двадцать-пять* 9 , 2,5, 7 , 7 , 19, 192, 5 , 0,14,23,22, 6* * тысяча тридцать четыре, 2, 20 * * тысяча тридцать-шести, 24,13,12, 21 * * тысяча тридцать восемь, 24, 21 , 6,11 * 1 041 * 21 * * тысяча сорок два,1, 20 , 5 , 8, 6 , 12,15, 192,21, 6 , 14 , * * 14 тысячу пятьдесят-три * 1 054 *, * +1055 * 11 * 1 056 *, 11 , 8,17,19,9 24 , * * 22 тысячу шестьдесят-одна , 6 , 24 * тысячу шестьдесят-шесть *, 11 , 2 , 22 * ​​1072 *, 6 , 13, 2 , 18,6,14,20,

Я что-то не так сделал в функции перестановки или что-то пропустил?

Спасибо за ответ на мой вопрос!

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Простая реализация в C ++ 11 на основе std::shuffle может выглядеть следующим образом:

int main() {
   std::random_device rd;
   std::mt19937 g(rd());

   std::array<std::array<int, 25>, 25> ddarray;

   for (auto& a : ddarray) {
      std::iota(a.begin(), a.end(), 1);
      std::shuffle(a.begin(), a.end(), g);
   }    
}

Демонстрационная версия: https://wandbox.org/permlink/0abgD0Yqv9K1B1D9.

0 голосов
/ 04 марта 2019

Здесь есть несколько вещей, которые можно / нужно улучшить.

  • Прежде всего, я бы рекомендовал использовать std::shuffle вместо того, чтобы использовать свою собственную версию.

  • Основная проблема, которая делает вашу программу недопустимой C ++: если x равно 25, то вы пытаетесь записать в arraystore[x], который находится после конца элемента 25массив.Возможно, вы захотите записать в arraystore[x-1].

  • Основная проблема, которая дает вам повторяющийся вывод: вы рандомизируете новый массив для каждого i во внутреннем цикле и затем используете толькоэлемент i (поэтому вы генерируете массивы 25*25 по 25 элементов в каждом).Может случиться (на самом деле, это очень вероятно), что вы будете повторять некоторые элементы таким образом.Правильный main будет выглядеть следующим образом:

    int main() {
        int ddarray[25][25];
        for (int j=0; j<25; ++j)
        {
            int array[25];
            permutation(array);
            for (int i=0; i<25; i++) {
                ddarray[j][i] = array[i];
            }
        }
    }
    

    (обратите внимание, что ++j также отсутствовал в вашем исходном коде ...)

  • Вашреализация permutation довольно неэффективна, потому что она должна перемещать множество элементов для каждого элемента вывода.Стандартный Фишер Йейтс shuffle просто меняет элементы на текущем выходе и случайно выбранном индексе.

  • Наконец, я бы предложил использовать std::array (или std::vector) вместо простых массивов.С последними очень неудобно / удивительно работать (и не имеют стандартной поддержки для разных размеров во время выполнения).

...