Подтвердить что ты не робот

Создание уникальных случайных чисел (целых чисел) между 0 и 'x'

Мне нужно сгенерировать набор уникальных (без дубликатов) целых чисел и между 0 и заданным числом.

То есть:

var limit = 10;
var amount = 3;

Как я могу использовать Javascript для генерации 3 уникальных чисел от 1 до 10?

4b9b3361

Ответ 1

Используйте основные методы Math:

  • 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

Ответ 2

Math.floor(Math.random() * (limit+1))

Math.random() генерирует число с плавающей запятой от 0 до 1, Math.floor() округляет его до целого числа.

Умножая его на число, вы фактически 0..number-1 диапазон 0..number-1. Если вы хотите создать его в диапазоне от num1 до num2, сделайте следующее:

Math.floor(Math.random() * (num2-num1 + 1) + num1)

Чтобы сгенерировать больше чисел, просто используйте цикл for и помещайте результаты в массив или записывайте их непосредственно в документ.

Ответ 3

function generateRange(pCount, pMin, pMax) {
    min = pMin < pMax ? pMin : pMax;
    max = pMax > pMin ? pMax : pMin;
    var resultArr = [], randNumber;
    while ( pCount > 0) {
        randNumber = Math.round(min + Math.random() * (max - min));
        if (resultArr.indexOf(randNumber) == -1) {
            resultArr.push(randNumber);
            pCount--;
        }
    }
    return resultArr;
}

В зависимости от необходимого диапазона метод возврата целого числа может быть изменен на: ceil (a, b], round [a, b], floor [a, b), для (a, b) это вопрос добавления 1 к min с этаж.

Ответ 4

Math.floor(Math.random()*limit)+1

Ответ 5

for(i = 0;i <amount; i++)
{
    var randomnumber=Math.floor(Math.random()*limit)+1
    document.write(randomnumber)
}

Ответ 6

Что-то вроде этого

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--;
    }
}

Ответ 7

Вот еще один алгоритм для обеспечения уникальности чисел:

  • сгенерировать массив всех чисел от 0 до x
  • перемешать массив, чтобы элементы находились в случайном порядке
  • выберите первый n

По сравнению с методом генерации случайных чисел, пока вы не получите уникальный, этот метод использует больше памяти, но имеет более стабильное время работы - результаты гарантированно будут найдены за конечное время. Этот метод работает лучше, если верхний предел относительно низок или если количество, которое требуется принять, относительно велико.

Мой ответ использует библиотеку Lodash для простоты, но вы также можете реализовать алгоритм, описанный выше, без этой библиотеки.

// assuming _ is the Lodash library

// generates `amount` numbers from 0 to `upperLimit` inclusive
function uniqueRandomInts(upperLimit, amount) {
    var possibleNumbers = _.range(upperLimit + 1);
    var shuffled = _.shuffle(possibleNumbers);
    return shuffled.slice(0, amount);
}

Ответ 8

Как указано, принятый ответ неверен. Здесь не повторяющийся генератор псевдослучайного числа, практически не влияющий на память, и нет проблем O (n), которые хороши для 10 000 000 номеров.

Здесь plunkr, демонстрирующий порт javascript ниже неповторяющегося псевдо-случайного генератора, найденного здесь github.com/preshing/RandomSequence.

var RandomSequenceOfUnique = (function() {      
  function RandomSequenceOfUnique(seedBase, seedOffset) {
    var prime = 4294967291,
        residue,
        permuteQPR = function(x) {
      if (x >= prime)
        return x; 
      residue = (x * x) % prime;
      return (x <= prime / 2) ? residue : prime - residue;
    }

    this.next = function() {
      return permuteQPR((permuteQPR(this.index++) + this.intermediateOffset) ^ 0x5bf03635);
    }

    this.index = permuteQPR(permuteQPR(seedBase) + 0x682f0161);
    this.intermediateOffset = permuteQPR(permuteQPR(seedOffset) + 0x46790905);
  }
  return RandomSequenceOfUnique;
}());

Построить экземпляр и сгенерировать число:

var generator = new RandomSequenceOfUnique(Date.now(), parseInt(Math.random() * 10000));

Использование генератора:

 var num = generator.next();

Здесь статья, объясняющая математику за генератором, Как создать последовательность уникальных случайных целых чисел

Ответ 9

var randomNums = function(amount, limit) {
var result = [],
    memo = {};

while(result.length < amount) {
    var num = Math.floor((Math.random() * limit) + 1);
    if(!memo[num]) { memo[num] = num; result.push(num); };
}
return result; }

Это похоже на работу и постоянный поиск дубликатов.

Ответ 10

/**
 * 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());
}