Skip to content

Instantly share code, notes, and snippets.

@nicetrysean
Last active November 8, 2023 23:36
Show Gist options
  • Save nicetrysean/10954338 to your computer and use it in GitHub Desktop.
Save nicetrysean/10954338 to your computer and use it in GitHub Desktop.
Haxe can't really generate a Uniquely random number within an array.. until now!
package;
class RandomUnique
{
public static function between(startNumber : Int = 0, endNumber : Int = 9) : Array<Int>
{
var baseNumber : Array<Int> = new Array();
var randNumber : Array<Int> = new Array();
for(i in startNumber...endNumber){
baseNumber[i] = i;
}
var i : Int = endNumber;
while( --i >= startNumber ){
var tempRandom : Int = startNumber + Math.floor( Math.random() * ( i - startNumber ) );
randNumber[i] = baseNumber[tempRandom];
baseNumber[tempRandom] = baseNumber[i];
}
randNumber[startNumber] = baseNumber[startNumber];
return randNumber;
}
}
@davzrm
Copy link

davzrm commented Sep 12, 2019

Hello,

I just stumbled upon this while looking for an RNG without duplicates. I like the idea behind this code.
But I noticed when there are only 2 numbers left in the range, the formula in the while loop can only choose the lower number.

I'd like to propose a revision:-
FROM line 13 onwards:

var i : Int = endNumber;
while( --i >= startNumber ){
var tempRandom : Int = startNumber + Math.floor( Math.random() * ( ( i+1) - startNumber ) );
randNumber[endNumber - (i+1)] = baseNumber[tempRandom];
baseNumber[tempRandom] = baseNumber[i];
}
//randNumber[startNumber] = baseNumber[startNumber]; (remove this line)


I'd also like to propose a version where you can choose how many numbers you'd want from the given:-
LINE 5 > public static function between(startNumber : Int = 0, endNumber : Int = 9, ?AmountDesired: Int = 0) : Array

ADD>
var tempAmount: Int;
if (AmountDesired != 0){
tempAmount = endNumber - AmountDesired;
}
else {
tempAmount = startNumber;
}

LINE 14 > while( --i >= tempAmount)

Sorry if it isn't clear enough, don't use Git very often.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment