Генерация уникальных случайных чисел от 1 до 100 - PullRequest
79 голосов
/ 04 марта 2010

Как я могу сгенерировать 8, скажем, уникальных случайных чисел от 1 до 100, используя JavaScript?

Ответы [ 26 ]

0 голосов
/ 27 апреля 2016

Это может обрабатывать генерирование до 20 цифр УНИКАЛЬНОГО случайного числа

JS

 var generatedNumbers = [];

    function generateRandomNumber(precision) { // input --> number precision in integer 
        if (precision <= 20) {
            var randomNum = Math.round(Math.random().toFixed(precision) * Math.pow(10, precision));
            if (generatedNumbers.indexOf(randomNum) > -1) {
                if (generatedNumbers.length == Math.pow(10, precision))
                    return "Generated all values with this precision";
                    return generateRandomNumber(precision);
            } else {
                generatedNumbers.push(randomNum);
                return randomNum;
            }
        } else
           return "Number Precision shoould not exceed 20";
    }
    generateRandomNumber(1);

enter image description here

jsFiddle

0 голосов
/ 15 февраля 2012
var bombout=0;
var checkArr=[];
var arr=[];
while(arr.length < 8 && bombout<100){
  bombout++;
  var randomNumber=Math.ceil(Math.random()*100);
  if(typeof checkArr[randomNumber] == "undefined"){
    checkArr[randomNumber]=1;
    arr.push(randomNumber);
  }
}​

// untested - hence bombout
0 голосов
/ 12 ноября 2014
function getUniqueRandomNos() {
    var indexedArrayOfRandomNo = [];
    for (var i = 0; i < 100; i++) {
        var randNo = Math.random();
        indexedArrayOfRandomNo.push([i, randNo]);
    }
    indexedArrayOfRandomNo.sort(function (arr1, arr2) {
        return arr1[1] - arr2[1]
    });
    var uniqueRandNoArray = [];
    for (i = 0; i < 8; i++) {
        uniqueRandNoArray.push(indexedArrayOfRandomNo[i][0]);
    }
    return uniqueRandNoArray;
}

Я думаю, что этот метод отличается от методов, приведенных в большинстве ответов, поэтому я подумал, что могу добавить ответ здесь (хотя вопрос был задан 4 года назад).

Мы генерируем 100 случайных чисел и помечаем каждое из них числами от 1 до 100. Затем мы сортируем эти помеченные случайные числа, и метки перемешиваются случайным образом. В качестве альтернативы, по мере необходимости в этом вопросе, можно было бы просто отказаться от поиска 8 лучших случайных чисел с тегами. Поиск топ-8 предметов дешевле, чем сортировка всего массива.

Здесь следует отметить, что алгоритм сортировки влияет на этот алгоритм. Если используемый алгоритм сортировки стабилен, существует небольшое смещение в пользу меньших чисел. В идеале, мы бы хотели, чтобы алгоритм сортировки был нестабильным и даже не смещался в сторону стабильности (или нестабильности), чтобы получить ответ с абсолютно равномерным распределением вероятностей.

0 голосов
/ 15 апреля 2012

если вам нужно больше уникальности, вы должны сгенерировать массив (1..100).

var arr=[];
function generateRandoms(){
for(var i=1;i<=100;i++) arr.push(i);
}
function extractUniqueRandom()
{
   if (arr.length==0) generateRandoms();
   var randIndex=Math.floor(arr.length*Math.random());
   var result=arr[randIndex];
   arr.splice(randIndex,1);
   return result;

}
function extractUniqueRandomArray(n)
{
   var resultArr=[];
   for(var i=0;i<n;i++) resultArr.push(extractUniqueRandom());
   return resultArr;
}

приведенный выше код работает быстрее:
extractUniqueRandomArray (50) => [2, 79, 38, 59, 63, 42, 52, 22, 78, 50, 39, 77, 1, 88, 40, 23, 48, 84, 91, 49, 4, 54, 93, 36, 100 , 82, 62, 41, 89, 12, 24, 31, 86, 92, 64, 75, 70, 61, 67, 98, 76, 80, 56, 90, 83, 44, 43, 47, 7, 53 ]

0 голосов
/ 30 августа 2013

Добавление еще одной лучшей версии того же кода (принятый ответ) с функцией JavaScript 1.6 indexOf. Не нужно повторять весь массив каждый раз, когда вы проверяете дубликат.

var arr = []
while(arr.length < 8){
  var randomnumber=Math.ceil(Math.random()*100)
  var found=false;
    if(arr.indexOf(randomnumber) > -1){found=true;}
  if(!found)arr[arr.length]=randomnumber;
}

Старая версия Javascript все еще может использовать версию вверху

PS: Пытался предложить обновление вики, но оно было отклонено. Я все еще думаю, что это может быть полезно для других.

0 голосов
/ 08 февраля 2014

Это мое личное решение:

<script>

var i, k;
var numbers = new Array();
k = Math.floor((Math.random()*8));
numbers[0]=k;
    for (var j=1;j<8;j++){
        k = Math.floor((Math.random()*8));
i=0;
while (i < numbers.length){
if (numbers[i] == k){
    k = Math.floor((Math.random()*8));
    i=0;
}else {i++;}
}
numbers[j]=k;
    }
    for (var j=0;j<8;j++){
alert (numbers[j]);
    }
</script>

Он случайным образом генерирует 8 уникальных значений массива (от 0 до 7), затем отображает их в окне предупреждения.

...