Last active
November 8, 2023 23:36
-
-
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!
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.