Произведите случайную перестановку в массиве в C ++

0

У меня есть один массив int* и я хочу выполнить произвольную перестановку в этот массив. Функция аналогична функции randperm в MATLAB. Например, у меня есть массив int* A=[0 1 1 0] и если я вызову randperm(A,sizeof A) тогда один возможный выход будет A=[1 0 0 1]

Это моя функция, но, похоже, есть ошибка. Может ли кто-нибудь определить, что это за ошибка?

void randperm(int* permMatrix,int n)
{
    int i, j, t;
    for(i=0; i<n; i++) {
        j = rand()%(n-i)+i;
        t = permMatrix[j];
        permMatrix[j] = permMatrix[i];
        permMatrix[i] = t;
    }
    for(i=0; i<n; i++) {
        printf("%d ",permMatrix[i]);
    }
}
  • 0
    Вывод ошибок показывает, например, A = [1 0 0 0] или A = [0 1 0 0]. Я потерял один бит, равный 1
  • 0
    Переменная типа int * не является матрицей, но может быть массивом.
Показать ещё 5 комментариев
Теги:
permutation
random

2 ответа

4

Всегда лучше использовать стандартные библиотеки, где они существуют. В этом случае заголовок <algorithm> имеет функцию std::random_shuffle() которая делает именно то, что вы хотите:

#include <algorithm>

void randperm(int* matrix, int size)
{
    std::random_shuffle(matrix, matrix + size);
}
  • 0
    +1. Я все еще пытаюсь выяснить, в чем причина отрицательного голосования.
  • 1
    Вероятно, опечатка в первом слове названия
0

Реализация "randperm" верна, но может быть sizeof (A) не оценивается как 4. Пожалуйста, проверьте значение "n".

Ещё вопросы

Сообщество Overcoder
Наверх
Меню