javascript - js 生成范围内不重复的随机数。

查看:207
本文介绍了javascript - js 生成范围内不重复的随机数。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

我的需求
在 0 - 3 之间(包含0与3)生成 2 个不重复的随机数。

我的方案
我没有使用do while的方案来做...

function randomNumbers($range){
    return $range[0] + Math.round(Math.random() * ($range[1] -  $range[0]));
}

// 生成随机数字
function generatedRandomNumbers($length,$range){
    var _randomNumber = randomNumbers($range),
        _array = [];
                    
    for(var i = 0;i < $length;i++){
        if(~_array.indexOf(_randomNumber)){
            _randomNumber = randomNumbers($range);
        }
        _array[i] = _randomNumber;
    }
    console.log(JSON.stringify(_array));
};

求助各位高手啦

解决方案

无重复的小范围随机和大范围随机是不一样的,小范围随机的思想基本上是随机排序再抽取其中一部分(通常就是前面几个)。大范围随机通常是直接在范围内产生随机数,再判断是否重复。

你这个是小范围的,所以很简单,一句话

[0,1,2,3].sort(() => Math.random() - 0.5).slice(0,2)

既然 [].sort(() => Math.random() - 0.5) 这种方法产生的随机数随机性不强,可以使用 Fisher–Yates shuffle 算法来做,说起来也不是多麻烦的事情,就是随机从剩余的数里抽取一个。

翻了一下我以前的某个回答,那是随机选一部分数据,应该还是切这个题的,那个回答里有个图可以帮助理解。那个如果选完就是洗牌了。

上代码(代码中生成了一个索引数组,目的是不改变原数组数据)

const data = [0, 1, 2, 3];

const r = Array.apply(null, { length: data.length })
    .map((n, i) => i)
    .map((n, i, all) => {
        const j = i + Math.floor(Math.random() * (all.length - i));
        const v = all[j];
        all[j] = n;
        return v;
    })
    .slice(0, 2)
    .map(i => {
        return data[i];
    });

console.log(r);

如果不要索引数组还简单些,但是会改变原数组顺序

const r = data
    .map((n, i, all) => {
        const j = i + Math.floor(Math.random() * (all.length - i));
        const v = all[j];
        all[j] = n;
        return v;
    })
    .slice(0, 2);

这篇关于javascript - js 生成范围内不重复的随机数。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆