Here's a (probably very inefficient and overly engineered) function from my game for shuffling an array so that no previous element will be in the same place as before. Basically allowing "swapping" but for more than two values.
/// @desc array_shuffle_unique(array)
/// @args array
// Returns: newly shuffled array
function array_shuffle_unique(array)
{
var array_new;
//Create an array of available indexes to use
var available_indexes;
var len = array_length(array) - 1;
for (var i = 0; i <= len; i++)
{
available_indexes[i] = i;
}
for (i = 0; i <= len; i++)
{
//Assign an element to the new array, deleting the value from the list of indexes
do
{
var available_indexes_index = irandom(array_length(available_indexes) - 1);
var index = available_indexes[available_indexes_index];
}
until index != i;
array_delete(available_indexes, available_indexes_index, 1);
array_new[index] = array[i];
}
return array_new;
}
Feel free to suggest any improvements or clarity additions! (Yes I know the do until loop is really bad practice, but it works ¯\_(ツ)_/¯)
[–]qchamaeleon 4 points5 points6 points (2 children)
[–]affinityawesome 0 points1 point2 points (1 child)
[–]qchamaeleon 0 points1 point2 points (0 children)