2013-02-15 5 views
-2

Я столкнулся с очень странной проблемой. Я попытался найти его решение, но напрасно. Моя проблема в том, что я хочу создать случайное число между 1-45, и я не хочу, чтобы это число повторялось снова.Хотите создать случайные числа между 1-45 без повторения

+3

принять. Массив, заполнить его диапазоном чисел, перетасовать, вывести значения – C5H8NNaO4

+0

-1. Без усилий. Случайная выборка без замены вовсе не странная проблема, она часто встречается в учебниках по программированию, и есть решения онлайн на многих языках, включая js. Если вы столкнулись с ошибкой «javascript random without replacement», первые три результата из stackoverflow, первый из них - http://stackoverflow.com/questions/12987719/javascript-how-to-randomly-sample-items-without-replacement. См. Также http://stackoverflow.com/questions/11935175/sampling-a-random-subset-from-an-array. – Paul

ответ

4

Случайный выбор, по определению, будет повторяться случайным образом.

Однако вы можете построить массив, содержащий каждое из ваших чисел, а затем перетасовать массив, создавая случайный порядок чисел без повторения.

var nums = [], i; 
for(i=1; i<=45; i++) nums.push(i); 
nums.sort(function(a,b) {return Math.random()-0.5;}); 
alert(nums.join(",")); 
+0

+1 для Math.random() -0.5 – C5H8NNaO4

+2

Будьте осторожны с [рандомизацией массивов таким образом, хотя ...] (http://www.robweir.com/blog/2010/02/microsoft-random-browser-ballot. html) – maerics

+0

Спасибо, работал как шарм +1 с моей стороны –

0

Это рабочий код ..

Random rd =new Random();  
int n = rd.Next(1,45); 
+0

>> new Random() ---- "'Random' is undefined" –

+0

Это должен быть JScript/.NET, а не чистый JavaScript. – maerics

+0

Вы уверены, что это не java? – C5H8NNaO4

0

То, что вы действительно хотите, чтобы создать набор чисел в заданном диапазоне и случайно удалить один из номеров до тех пор, пока не установятся пуст.

Вот функция, которая генерирует другую функцию, которая делает именно то, что:

function generateRandomRangeSet(beg, end) { 
    var numbers = []; // Create an array in range [beg, end]. 
    for (var i=beg; i<=end; i++) { numbers.push(i); } 
    return function() { 
    if (numbers.length < 1) { throw new Error('no more numbers'); } 
    var i=Math.floor(Math.random()*numbers.length), number=numbers[i]; 
    numbers.splice(i, 1); // Return and remove a random element of the array. 
    return number; 
    } 
} 

var r = generateRandomRangeSet(1, 45); 
r(); // => 9 
r(); // => 24 
r(); // => 7 ... for each number [1, 45] then ... 
r(); // Error: no more numbers 
+0

Опираясь на новые методы Object.prototype. Вышеупомянутый код не работает в IE8 и ниже. –

+0

@Kolink: обновлен для работы с любой версией ECMAScript. – maerics

Смежные вопросы