あなたのアルゴリズムは非常に効果的ではありません。配列がほぼいっぱいになると、運が良ければ文字通り何百万もの無駄な反復を行い、RNGが誤って欠落している数を選択します。次のように書き直します。
- 1から99までのすべての可能な数の配列を生成します。
- 乱数が必要な場合は、この配列の現在の境界、スプライス要素、およびこのランダムな位置にランダムインデックスを生成し、配列から削除して、その値を目的の乱数として使用します。
- 生成された数値が条件の一部に適合しない場合(minDiff?)、それらを配列に戻します。アレイに残っているすべてのものが条件に適合しない場合でも、ループ内で永久にストールする可能性があることに注意してください。
この方法で配列から取得するすべての値は、元々一意の番号で埋めて使用時に削除するため、一意であることが保証されます。
図面を削除し、生成された数値を配列に配置して、コンソールで確認できるようにしました。図面を元に戻すと、機能するはずです。数値はすぐに生成されます。
var snakes = ['./Images/Snakes/snake1.png','./Images/Snakes/snake2.jpg','./Images/Snakes/snake3.gif','./Images/Snakes/snake4.gif','./Images/Snakes/snake5.gif','./Images/Snakes/snake6.jpg'];
var ladders = ['./Images/Ladders/ladder1.jpg','./Images/Ladders/ladder2.jpg','./Images/Ladders/ladder3.png','./Images/Ladders/ladder4.jpg','./Images/Ladders/ladder5.png'];
function drawTable()
{
// Now generating snakes.
generateRand(snakes,0);
generateRand(ladders,1);
}
var uniqNumbers = []
for(var idx = 1; idx < 100; idx++){ uniqNumbers.push(idx) }
var results = []
function generateRand(arr,flag)
{
var valFlag = 0;
var minDiff = 8; // Minimum difference between start of snake/ladder to its end.
var temp;
for(var i = 0; i< arr.length; ++i) {
var valid = false
// This is the single place it still can hang, through with current size of arrays it is highly unlikely
do {
var random_1 = uniqNumbers.splice(Math.random() * uniqNumbers.length, 1)[0]
var random_2 = uniqNumbers.splice(Math.random() * uniqNumbers.length, 1)[0]
if (Math.abs(random_1 - random_2) < minDiff) {
// return numbers
uniqNumbers.push(random_1)
uniqNumbers.push(random_2)
} else {
valid = true
}
} while (!valid);
if(flag == 0) // Snake
{
if(random_1 < random_2) // Swapping them if the first number is smaller than the second number.
{
var temp = random_1; random_1 = random_2; random_2 = temp
}
}
else // Ladders
{
if(random_1>random_2) // Swapping them if the first number is greater than the second number.
{
var temp = random_1; random_1 = random_2; random_2 = temp
}
}
// Just for debug - look results up on console
results.push([random_1, random_2])
}
}
drawTable()