如何制作没有重复的随机数组?

时间:2016-06-22 09:05:47

标签: javascript random spinner repeat

我一直在寻找这个问题的一些答案,但是当我试图找到解决方案时似乎没有任何效果。

我想要实现的是在Javascript&中创建一个微调器。 Adobe Edge 随机旋转数字不再重复该数字,直到所有数字都被旋转。

我知道这对于一个体面的程序员来说应该相当容易,但我还不是那么有经验。

这是我到目前为止所做的,但是它还没有完成,而且还有错误:

public class SomeTopClass
{

    // ...

    public class FileSizeFormatProvider : IFormatProvider, ICustomFormatter
    {
        // ...
    }

    // class is in SomeClass, therefore it is a nested class. You cannot define extension mathods here
    public static class ExtensionMethods
    {
        public static string ToFileSize(this long l)
        {
            return String.Format(new FileSizeFormatProvider(), "{0:fs}", l);
        }
    }
}

希望有人可以帮助我。提前谢谢。

6 个答案:

答案 0 :(得分:4)

有两种方法可以实现这一目标。

  1. 存储已旋转的值数组。然后,当您生成一个新数字时,检查它是否在旋转数字数组中。如果是,则生成一个新数字并再次检查,直到得到一个不在数组中的数字。否则,将其添加到数组中。

  2. 正如您所做的那样,预先生成所有有效数字的数组。然后,每次旋转数字时,将其从该数组中删除。这样,下次你“旋转”时,你只会选择尚未旋转的值。

  3. 预先生成所有有效数字的数组,然后随机排序。然后你所要做的就是继续拍摄数组中的第一项。

  4. 按顺序,选项3是最优雅的,但它的缺点是控制台打开的人可能会看到下一个确切的数字!选项2是次佳的,如果允许用户知道某个号码不能出现两次,他们就不能通过查看剩余的可用号码来“欺骗”。选项1的效率最低 - 因为这意味着您的代码需要做更多的工作才能尝试找到“免费”号码。

    老实说,如果你的游戏需要完全不受黑客攻击,那么你不会想要生成任何随机数的客户端,所以如果这只是为了一点乐趣,那么哪个方法并不重要你用。如果你是为赌博网站写的,首先让我知道哪一个我可以发财,然后将你的逻辑移到服务器上。

    所以这是选项2方法的一个例子

    <!DOCTYPE html>
    <html>
    <head>
        <script>
    
            var numbers = []; // this array will store the available numbers..
    
            function generateNumbers()
            {
                // populate the available numbers however you need to..
                for(var i=0; i<360; i+=30)
                {
                    numbers.push(i);
                }
            }
    
            function spin()
            {
                if(numbers.length==0)
                {
                    // then we've used  up all available numbers..start new game or whatever you need to do..
                    alert("starting again");
                    generateNumbers();
                }
                var rand = Math.floor(Math.random()*numbers.length); // select an index randomly based on the number of remaining available numbers..
                var num = numbers[rand];
                numbers.splice(rand,1); // remove the number we selected so it can't be selected next time..
                document.getElementById("number").innerHTML = num;
            }
    
        </script>
    </head>
    <body>
    <button onclick="spin()">SPIN</button>
    <div id="number"></div>
    </body>
    </html>
    

    以下选项3.主要区别在于您只需移动()下一个值而不必随意选择。

    <!DOCTYPE html>
    <html>
    <head>
        <script>
    
            var numbers = [];
    
            function generateNumbers()
            {
                for(var i=0; i<360; i+=30)
                {
                    numbers.push(i);
                }
                function sort(a,b)
                {
                    return (Math.random()>0.5)? -1 : 1;
                }
                numbers.sort(sort);
            }
    
            function spin()
            {
                if(numbers.length==0)
                {
                    alert("starting again");
                    generateNumbers();
                }
                var num = numbers.shift();
                document.getElementById("available").innerHTML = "Available:" + numbers.join(",");
                document.getElementById("number").innerHTML = "Selected:" + num;
            }
    
        </script>
    </head>
    <body>
    <button onclick="spin()">SPIN</button>
    <div id="available"></div>
    <div id="number"></div>
    </body>
    </html>
    

    希望这能让您了解如何将其融入代码中。

答案 1 :(得分:3)

看起来你已经有了一系列可能的值。在这种情况下,您可以简单地对阵列进行洗牌并完成它。 JavaScript没有内置的shuffle函数,但实现起来非常简单。

以下是Fisher–Yates shuffle

的示例
mov

答案 2 :(得分:1)

您需要做的是,选择一个随机数并将其存储在数组中,但在存储之前,检查该数组中是否已存在如果坚强>,那么选择另一个。 如果您选择的值数组包含所有可能的值,则重置数组。

以下是示例:https://jsfiddle.net/5a7mqsbn/1/

&#13;
&#13;
var alreadyArr = new Array();
$(function() {
  $("#generate").click(function() {
    var newFound = false;
    do {
      var num = (Math.floor(Math.random() * 12) + 1) * 30;
      if (alreadyArr.length == 12) {
        alreadyArr = [num];
        newFound = true;
      } else if (alreadyArr.indexOf(num) < 0) {
        alreadyArr.push(num);
        newFound = true;
      }
    } while (!newFound);
    $("#numbers").text(alreadyArr);
  });
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<p id="numbers"></p>
<button id="generate">
  Next Random number
</button>
&#13;
&#13;
&#13;

答案 3 :(得分:1)

    var array = [];

    setInterval(function(){

        if(array .length === 0){ 
            reload(); 
        }

        var result = getRandom();

        console.log(result);

    },1000);

    function getRandom(){
        var index = (array.length === 1 ? 0 : Math.floor(Math.random() * array.length));
        return array.splice(index, 1)[0];
    }

    function reload(){
        array = [2,3,4,5,6,7,8,9,0,1,44,66];
    }

答案 4 :(得分:0)

此函数将使用Math.random()随机选择数组中的数字,而不是在使用所有数字之前再次选择它:

var originalArray = ['360', '330', '300', '270', '240', '210', 
'180', '150', '120', '90', '60', '30'];

var totalSpin = [];

function spinArray(){
    var spin = Math.floor(Math.random()*originalArray.length);
    if(totalSpin.indexOf(spin) == -1){
        totalSpin.push(spin);
        parag.innerHTML = originalArray[spin];
    } else { 
        spinArray(); 
    }
    if(totalSpin.length == originalArray.length)
          totalSpin = [];
}

这是小提琴:https://jsfiddle.net/628yqz0v/4/

答案 5 :(得分:0)

鉴于已经拥有数组值并且需要randomize的位置,您可以采用另一种方法是使用Set生成unique random values

var data = ['360', '330', '300', '270', '240', '210','180', '150', '120', '90', '60', '30'];

let getUniqueRandomNumbers = n => {
  let set = new Set()
  while (set.size < n) set.add(Math.floor(Math.random() * n))
  return Array.from(set)
}

let result = getUniqueRandomNumbers(data.length).map(x => data[x])

console.log(result)

这个想法是生成新数组的索引,然后使用它们通过Array.map填充它。

您可以采用的另一种方法是通过Array.sortMath.random

var data = ['360', '330', '300', '270', '240', '210','180', '150', '120', '90', '60', '30'];

let result = data.sort(function(a, b){
 return 0.5 - Math.random()  // <— sort needs a number and this makes it work
});

console.log(result);