Wpis z mikrobloga

Mam tablicę [1,2,3,4] i chcę ją posortować przypadkowo, ale mam warunek, że żadna wartość nie może być na tej samej pozycji co wcześniej. Czyli w normalnym losowniu kolejności może wyjść taki wynik: [2,4,3,1] czyli liczba 3 jest w tym samym miejscu. Muszę tego uniknąć. Wie ktoś jak to zrobić szybko i skutecznie?

Bo ja zrobiłem funckję do tego, ale czasami się wywala - to zależy od losowania. Czasem wyjdzie tak, że ostatnia cyfra z tablicy zostanie na samym końcu i wtedy tablica copyArr zostaje pusta i przypisywana jest wartość 'undefined'. Łatwo moge to obejść, ale ta funkcja i tak jest dość skomplikowana i się zastanawiam czy ktoś ma jakąś lepszą i bardziej zgrabną wersję.

public function uniqSort(ar:Array):Array {
var input:Array = ar;
var output:Array = new Array;
var random:int;

for (var i:int = 0; i < input.length; i++) {

var copyArr:Array = ObjectUtil.copy(input) as Array; //robi kopię obiektu
copyArr.splice(i,1); //usuwa 1 wartość na pozycji i

for each (var j:int in output) {
var idx:int = copyArr.indexOf(j);
if (idx > -1) {
copyArr.splice(idx,1); //usuwa 1 wartość na pozycji idx
}
}
random = Math.random() * copyArr.length;

if (copyArr[random] == undefined) trace ('error') //tu się wywala raz na jakiś czas; zwraca undefined, bo tablica copyArr jest pusta

output.push(copyArr[random]);
}
return output;
}

#programowanie
  • 18
@sokytsinolop: @inhibitormonoaminooksydazy: pozycja jednej konkretnej cyfry raczej nie będzie randomem z pozostałych miejsc, bo w ogóle nie uwzględnia pozostałych cyfr i powstaje ten problem z ostatnią cyfrą,

Ale już permutacja wszystkich liczb może być losowo wybrana ze zbioru, który powstanie po uwzględnieniu ograniczeń. Jednak nie mam pomysłu, żeby to działało dla długiej listy innego niż wygenerowanie wszystkich dozwolonych permutacji i losowo wybranie jednej z nich.
@Hauleth: czytam i jedyne co widzę to ten fragment:
Sattolo's algorithm, which produces only permutations consisting of a single cycle involving all elements: in particular, with this modification, no element of the array can ever end up in its original position.
Ale zastosowałem algorytm Sattolo i nie daje tego efektu który potrzebuje,bo liczby wciąż są w tych samych miejscach.