数学随机数不重复以前的数字

IT技术 javascript random repeat
2021-02-09 21:12:57

似乎无法找到答案,说我有这个:

setInterval(function() {
    m = Math.floor(Math.random()*7);
    $('.foo:nth-of-type('+m+')').fadeIn(300);
}, 300);

我如何做到这一点,以便随机数不会重复。比如随机数是2,我就不想2再出来了。

6个回答

有多种方法可以实现这一点。

解决方案 A:如果数字的范围不大(比方说小于 10),您可以跟踪您已经生成的数字。然后,如果您生成重复项,则丢弃它并生成另一个数字。

方案B:预先生成随机数,存入数组,然后遍历数组。你可以通过取数字1,2,...,n然后洗牌来实现这一点

shuffle = function(o) {
    for(var j, x, i = o.length; i; j = parseInt(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
    return o;
};

var randorder = shuffle([0,1,2,3,4,5,6]);
var index = 0;

setInterval(function() {
    $('.foo:nth-of-type('+(randorder[index++])+')').fadeIn(300);
}, 300);

解决方案 C:跟踪数组中可用的数字。随机选择一个数字。从所述数组中删除数字。

var randnums = [0,1,2,3,4,5,6];

setInterval(function() {
    var m = Math.floor(Math.random()*randnums.length);
    $('.foo:nth-of-type('+(randnums[m])+')').fadeIn(300);
    randnums = randnums.splice(m,1);
}, 300);
谢谢,当场写得很快:)
2021-03-16 21:12:57
请不要推荐解决方案A。当“未使用”的数字很少并且您循环进行大量的重试直到math.random偶然发现其中一个时,它很容易导致性能大幅下降
2021-03-19 21:12:57
@tskuzzy - 伙计,非常感谢!稍后我将对这些答案进行更多研究。毫无意义地询问和依赖他人,你不会得到这样的结果。谢谢!
2021-03-21 21:12:57
+1。我修复了解决方案 B 中的一个明显错误(更改index++randorder[index++]);希望没事。
2021-03-24 21:12:57
您是否复制了shuffle()我提供的链接中描述功能?snippets.dzone.com/posts/show/849shuffle()不是标准的 javascript 函数。:)
2021-04-06 21:12:57

您似乎想要一个从 0 到 6 的非重复随机数,因此类似于 tskuzzy 的回答:

var getRand = (function() {
    var nums = [0,1,2,3,4,5,6];
    var current = [];
    function rand(n) {
        return (Math.random() * n)|0;
    }
    return function() {
      if (!current.length) current = nums.slice();
      return current.splice(rand(current.length), 1);
    }
}());

它将以随机顺序返回数字 0 到 6。当每个都被绘制一次后,它将重新开始。

你可以试试吗

setInterval(function() {
    m = Math.floor(Math.random()*7);
    $('.foo:nth-of-type(' + m + ')').fadeIn(300);
}, 300);
不,那行不通,抱歉,这是我在示例问题中的错误。这实际上就是我想提出这个问题的意思。
2021-03-20 21:12:57

我喜欢尼尔的回答,尽管这是在乞求一些递归。这是在java中,你仍然会得到一般的想法。请注意,如果您拉出的数字多于 MAX,您将遇到无限循环,我可以解决这个问题,但为了清楚起见,将其保留原样。

编辑:看到尼尔添加了一个while循环,所以效果很好。

public class RandCheck {
    private List<Integer> numbers;
    private Random rand;
    private int MAX = 100;

    public RandCheck(){
        numbers = new ArrayList<Integer>();
        rand = new Random();
    }

    public int getRandomNum(){
        return getRandomNumRecursive(getRand());
    }

    private int getRandomNumRecursive(int num){
        if(numbers.contains(num)){
            return getRandomNumRecursive(getRand());
        } else {
            return num;
        }
    }

    private int getRand(){
        return rand.nextInt(MAX);
    }

    public static void main(String[] args){
        RandCheck randCheck = new RandCheck();

        for(int i = 0; i < 100; i++){
            System.out.println(randCheck.getRandomNum());
        }
    }
}
抱歉,您的代码是用 Java 编写的。问题是询问 Javascript。无论如何,为努力+1 :)
2021-04-10 21:12:57

通常,我的方法是制作一个包含所有可能值的数组,然后:

  1. 选择一个随机数 <= 数组的大小
  2. 从数组中删除所选元素
  3. 重复步骤 1-2 直到数组为空

生成的一组数字将包含您的所有索引而不会重复。

更好的是,也许是这样的:

var numArray = [0,1,2,3,4,5,6];
numArray.shuffle();

然后只需浏览这些项目,因为 shuffle 会将它们随机化并一次弹出一个。

好吧,我被卡住了,我之前没有在 jquery 中处理过数组。:~|
2021-04-03 21:12:57
您用来调用 JQuery 函数的代码已经是 JavaScript,而这只是一个 JavaScript 数组。你能行的!
2021-04-04 21:12:57