Мне нужно сгенерировать набор уникальных (без дубликатов) целых чисел и между 0 и заданным числом.
То есть:
var limit = 10;
var amount = 3;
Как я могу использовать Javascript для генерации 3 уникальных чисел от 1 до 10?
Мне нужно сгенерировать набор уникальных (без дубликатов) целых чисел и между 0 и заданным числом.
То есть:
var limit = 10;
var amount = 3;
Как я могу использовать Javascript для генерации 3 уникальных чисел от 1 до 10?
Используйте основные методы Math
:
Math.random()
возвращает случайное число от 0 до 1 (включая 0, исключая 1).Закруглите это число
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
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 и помещайте результаты в массив или записывайте их непосредственно в документ.
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 с этаж.
Math.floor(Math.random()*limit)+1
for(i = 0;i <amount; i++)
{
var randomnumber=Math.floor(Math.random()*limit)+1
document.write(randomnumber)
}
Что-то вроде этого
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--;
}
}
Вот еще один алгоритм для обеспечения уникальности чисел:
По сравнению с методом генерации случайных чисел, пока вы не получите уникальный, этот метод использует больше памяти, но имеет более стабильное время работы - результаты гарантированно будут найдены за конечное время. Этот метод работает лучше, если верхний предел относительно низок или если количество, которое требуется принять, относительно велико.
Мой ответ использует библиотеку 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);
}
Как указано, принятый ответ неверен. Здесь не повторяющийся генератор псевдослучайного числа, практически не влияющий на память, и нет проблем 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();
Здесь статья, объясняющая математику за генератором, Как создать последовательность уникальных случайных целых чисел
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; }
Это похоже на работу и постоянный поиск дубликатов.
/**
* 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());
}