Javascript 生成0和'之间的唯一随机数(整数);x';

Javascript 生成0和'之间的唯一随机数(整数);x';,javascript,random,Javascript,Random,我需要生成一组唯一(无重复)的整数,介于0和给定数字之间 即: var limit = 10; var amount = 3; 如何使用Javascript生成3个介于1和10之间的唯一数字?使用基本的数学方法: Math.random()返回一个介于0和1之间的随机数(包括0,不包括1) 将该数字乘以所需的最高数字(例如10) 将此数字向下舍入到最接近的整数 Math.floor(Math.random()*10) + 1 例如: //Example, including custo

我需要生成一组唯一(无重复)的整数,介于0和给定数字之间

即:

var limit = 10;
var amount = 3;

如何使用Javascript生成3个介于1和10之间的唯一数字?

使用基本的
数学方法:

  • Math.random()
    返回一个介于0和1之间的随机数(包括0,不包括1)
  • 将该数字乘以所需的最高数字(例如10)
  • 将此数字向下舍入到最接近的整数

    Math.floor(Math.random()*10) + 1
    
例如:

//Example, including customisable intervals [lower_bound, upper_bound)
var limit = 10,
    amount = 3,
    lower_bound = 1,
    upper_bound = 10,
    unique_random_numbers = [];

if (amount > limit) limit = amount; //Infinite loop if you want more unique
                                    //Natural numbers than exist in a
                                    // given range
while (unique_random_numbers.length < limit) {
    var random_number = Math.floor(Math.random()*(upper_bound - lower_bound) + lower_bound);
    if (unique_random_numbers.indexOf(random_number) == -1) { 
        // Yay! new random number
        unique_random_numbers.push( random_number );
    }
}
// unique_random_numbers is an array containing 3 unique numbers in the given range
//示例,包括可定制的间隔[下限,上限]
var限值=10,
金额=3,
下界=1,
上界=10,
唯一随机数=[];
if(amount>limit)limit=amount;//如果希望更唯一,则无限循环
//自然数比存在于
//给定范围
while(唯一随机数。长度<限制){
var random\u number=Math.floor(Math.random()*(上限-下限)+下限);
如果(唯一随机数)indexOf(随机数)=-1{
//耶!新的随机数
唯一随机数。推送(随机数);
}
}
//unique_random_numbers是一个数组,包含给定范围内的3个唯一数字
用于(i=0;i
Math.random()
生成一个介于0和1之间的浮点数,
Math.floor()
将其舍入为整数

通过将其乘以一个数字,可以有效地使范围
0..number-1
。如果希望在
num1
num2
之间生成它,请执行以下操作:

Math.floor(Math.random() * (num2-num1 + 1) + num1)
要生成更多的数字,只需使用for循环并将结果放入数组或直接将其写入文档。

类似这样的内容

var limit = 10;
var amount = 3;
var nums = new Array();

for(int i = 0; i < amount; i++)
{
    var add = true;
    var n = Math.round(Math.random()*limit + 1;
    for(int j = 0; j < limit.length; j++)
    {
        if(nums[j] == n)
        {
            add = false;
        }
    }
    if(add)
    {
        nums.push(n)
    }
    else
    {
        i--;
    }
}
var限值=10;
风险价值金额=3;
var nums=新数组();
对于(int i=0;i
函数生成器(pCount、pMin、pMax){
min=pMinpMin?pMax:pMin;
var resultar=[],随机数;
而(pCount>0){
randNumber=Math.round(min+Math.random()*(max-min));
if(resultar.indexOf(randNumber)=-1){
结果推送(随机数);
pCount--;
}
}
返回结果器;
}

根据需要的范围,返回整数的方法可以更改为:(a,b),[a,b],[a,b],因为(a,b)是将1与最小值相加的问题。

以下是另一种确保数字唯一的算法:

  • 生成从0到x的所有数字的数组
  • 洗牌数组,使元素以随机顺序排列
  • 选择第一个n
  • 与生成随机数直到得到唯一数的方法相比,该方法使用了更多内存,但运行时间更稳定–结果保证在有限时间内找到。如果上限相对较低或需要的数量相对较高,则该方法效果更好

    为了简单起见,我的答案使用了这个库,但是您也可以在没有这个库的情况下实现上面描述的算法

    //假设u'是Lodash库
    //生成从0到上限(含)的“金额”数字
    函数uniqueRandomInts(上限、金额){
    var-possibleNumbers=u0.range(上限+1);
    var shuffled=uu0.shuffle(可能的枚举数);
    返回洗牌。切片(0,数量);
    }
    
    var randomNums=函数(金额、限额){
    var结果=[],
    备忘录={};
    while(result.length
    这似乎是可行的,它不断地查找重复项。

    /**
    
    /**
     * Generates an array with numbers between
     * min and max randomly positioned.
     */
    function genArr(min, max, numOfSwaps){
      var size = (max-min) + 1;
      numOfSwaps = numOfSwaps || size;
      var arr = Array.apply(null, Array(size));
    
      for(var i = 0, j = min; i < size & j <= max; i++, j++) {
        arr[i] = j;
      }
    
      for(var i = 0; i < numOfSwaps; i++) {
        var idx1 = Math.round(Math.random() * (size - 1));
        var idx2 = Math.round(Math.random() * (size - 1));
    
        var temp = arr[idx1];
        arr[idx1] = arr[idx2];
        arr[idx2] = temp;
      }
    
      return arr;
    }
    
    /* generating the array and using it to get 3 uniques numbers */
    var arr = genArr(1, 10);
    for(var i = 0; i < 3; i++) {
      console.log(arr.pop());
    }
    
    *生成一个数字介于 *最小值和最大值随机定位。 */ 功能genArr(最小值、最大值、numOfSwaps){ 变量大小=(最大-最小)+1; numOfSwaps=numOfSwaps | |大小; var arr=Array.apply(null,数组(大小)); 对于(变量i=0,j=min;i示例

    console.log(`Random no between 0 and 10 ${getRandomNo(0,10)}`)
    

    以下是一个简单的单线解决方案:

    var limit = 10;
    var amount = 3;
    
    randoSequence(1, limit).slice(0, amount);
    
    它用于生成从1到10的随机混合整数数组,然后将第三个整数后面的所有内容都截断。如果要使用此答案,请将其放入HTML文档的head标记中:

    <script src="https://randojs.com/1.0.0.js"></script>
    

    我认为,这是最人性化的方法(使用中断while循环),我在评论中解释了它的机制

    function generateRandomUniqueNumbersArray (limit) {
    
        //we need to store these numbers somewhere
        const array = new Array();
        //how many times we added a valid number (for if statement later)
        let counter = 0;
    
        //we will be generating random numbers until we are satisfied
        while (true) {
    
            //create that number
            const newRandomNumber = Math.floor(Math.random() * limit);
    
            //if we do not have this number in our array, we will add it
            if (!array.includes(newRandomNumber)) {
                array.push(newRandomNumber);
                counter++;
            }
    
            //if we have enought of numbers, we do not need to generate them anymore
            if (counter >= limit) {
                break;
            }
        }
    
        //now hand over this stuff
        return array;
    }
    

    当然,如果您需要更少的数字,您可以在最后一个“if”语句中添加不同的限制(您的数量),但请确保它小于或等于数字本身的限制-否则它将是无限循环。

    这些答案要么没有给出唯一的值,要么太长(甚至可以添加一个外部库来完成这样一项简单的任务)

    1。生成一个随机数。
    2。如果我们已经有了这个随机项,那么转到1,否则保留它。
    3。如果我们没有所需的随机数,那么转到1

    函数uniqueRandoms(数量、最小值、最大值){
    var rnd,arr=[];
    do{do{rnd=Math.floor(Math.random()*max)+min}
    而(包括(rnd))
    arr.push(rnd);
    
    }而(arr.length正是基于ES6集的另一种可能的解决方案(“arr.只能包含唯一值”)

    用法示例:

    // Get 4 unique rnd. numbers: from 0 until 4 (inclusive):
    getUniqueNumbersInRange(4, 0, 5) //-> [5, 0, 4, 1];
    
    // Get 2 unique rnd. numbers: from -1 until 2 (inclusive):
    getUniqueNumbersInRange(2, -1, 2) //-> [1, -1];
    
    // Get 0 unique rnd. numbers (empty result): from -1 until 2 (inclusive):
    getUniqueNumbersInRange(0, -1, 2) //-> [];
    
    // Get 7 unique rnd. numbers: from 1 until 7 (inclusive):
    getUniqueNumbersInRange(7, 1, 7) //-> [ 3, 1, 6, 2, 7, 5, 4];
    
    const getRandomNo = (min, max) => { min = Math.ceil(min); max = Math.floor(max); return Math.floor(Math.random() * (max - min + 1)) + min; }
    console.log(`Random no between 0 and 10 ${getRandomNo(0,10)}`)
    
    var limit = 10;
    var amount = 3;
    
    randoSequence(1, limit).slice(0, amount);
    
    <script src="https://randojs.com/1.0.0.js"></script>
    
    function generateRandomUniqueNumbersArray (limit) {
    
        //we need to store these numbers somewhere
        const array = new Array();
        //how many times we added a valid number (for if statement later)
        let counter = 0;
    
        //we will be generating random numbers until we are satisfied
        while (true) {
    
            //create that number
            const newRandomNumber = Math.floor(Math.random() * limit);
    
            //if we do not have this number in our array, we will add it
            if (!array.includes(newRandomNumber)) {
                array.push(newRandomNumber);
                counter++;
            }
    
            //if we have enought of numbers, we do not need to generate them anymore
            if (counter >= limit) {
                break;
            }
        }
    
        //now hand over this stuff
        return array;
    }
    
    // Get 4 unique rnd. numbers: from 0 until 4 (inclusive):
    getUniqueNumbersInRange(4, 0, 5) //-> [5, 0, 4, 1];
    
    // Get 2 unique rnd. numbers: from -1 until 2 (inclusive):
    getUniqueNumbersInRange(2, -1, 2) //-> [1, -1];
    
    // Get 0 unique rnd. numbers (empty result): from -1 until 2 (inclusive):
    getUniqueNumbersInRange(0, -1, 2) //-> [];
    
    // Get 7 unique rnd. numbers: from 1 until 7 (inclusive):
    getUniqueNumbersInRange(7, 1, 7) //-> [ 3, 1, 6, 2, 7, 5, 4];
    
    function getUniqueNumbersInRange(uniqueNumbersCount, fromInclusive, untilInclusive) {
    
        // 0/3. Check inputs.
        if (0 > uniqueNumbersCount) throw new Error('The number of unique numbers cannot be negative.');
        if (fromInclusive > untilInclusive) throw new Error('"From" bound "' + fromInclusive
            + '" cannot be greater than "until" bound "' + untilInclusive + '".');
        const rangeLength = untilInclusive - fromInclusive + 1;
        if (uniqueNumbersCount > rangeLength) throw new Error('The length of the range is ' + rangeLength + '=['
            + fromInclusive + '…' + untilInclusive + '] that is smaller than '
            + uniqueNumbersCount + ' (specified count of result numbers).');
        if (uniqueNumbersCount === 0) return [];
    
    
        // 1/3. Create a new "Set" – object that stores unique values of any type, whether primitive values or object references.
        // MDN - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set
        // Support: Google Chrome 38+(2014.10), Firefox 13+, IE 11+
        const uniqueDigits = new Set();
    
    
        // 2/3. Fill with random numbers.        
        while (uniqueNumbersCount > uniqueDigits.size) {
            // Generate and add an random integer in specified range.
            const nextRngNmb = Math.floor(Math.random() * rangeLength) + fromInclusive;
            uniqueDigits.add(nextRngNmb);
        }
    
    
        // 3/3. Convert "Set" with unique numbers into an array with "Array.from()".
        // MDN – https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from
        // Support: Google Chrome 45+ (2015.09+), Firefox 32+, not IE
        const resArray = Array.from(uniqueDigits);
        return resArray;
    
    }