Генерация случайных числ без повторений
Привет обитателям форума :)
учебная задача с которой я сегодня столкнулся звучит так: Цитата:
function makeRand() {
var usedNumbers = [];
function f() {
outer:
while(true) {
var num = Math.floor(Math.random() * 100) + 1;
for (var i = 0; i < usedNumbers.length; i++) {
if (usedNumbers[i] === num) break outer;
} break;
}
usedNumbers.push(num);
return num;
}
return f;
}
var func = makeRand();
func();
но данный код почему-то не работает, в массив попадают уже использованные числа, после еще часа мучений было придумано решение с рекурсией которое работает, но кажется выглядит как дикий костыль.
function makeRand() {
var usedNumbers = [];
function f() {
if (usedNumbers.length === 100) {
return;
}
var num = Math.floor(Math.random() * 100) + 1;
for (var i = 0; i < usedNumbers.length; i++) {
if (num === usedNumbers[i]) return f();
}
usedNumbers.push(num);
return num;
}
return f;
}
var func = makeRand();
//ниже вызов много раз
func();
Собственно вопросы: 1. Почему код с конструкцией while(true) break output не работает правильно 2. Какое оптимальное решение вы видите в данной задаче? |
ytil,
создать массив и перемешать. |
Цитата:
|
Цитата:
|
Генерация случайных числ без повторений
ytil,
<script>
function makeRand(num) {
var usedNumbers = [num--];
!function f() {
var i = Math.round(Math.random() * usedNumbers.length);
usedNumbers.splice(i,0,num--);
num && f()
}();
return usedNumbers;
}
var arr = makeRand(100);
document.write(arr)
</script>
|
задача там не в том, чтобы хранить результат, а в том чтобы выводить числа которые были не использованы. Почему мой код с циклом не работает? можете взглянуть?
|
Цитата:
Цитата:
|
Цитата:
|
Цитата:
<script>
function makeRand(num) {
var usedNumbers = {length : 0};
function f() {
if(usedNumbers.length == num) usedNumbers = {length : 0};
var i = Math.floor(Math.random() * num);
return i in usedNumbers ? f() : (usedNumbers.length++, usedNumbers[i]=true, ++i)
}
return f;
}
var x = makeRand(100);
document.write(x()+"<br>");
document.write(x()+"<br>");
document.write(x()+"<br>");
</script>
|
ytil,
для новых браузеров
<script>
function makeRand(num) {
var usedNumbers = [];
function f() {
if(usedNumbers.length == num) usedNumbers = [];
var i = Math.floor(Math.random() * num) + 1;
return usedNumbers.includes(i) ? f() : (usedNumbers.push(i),i)
}
return f;
}
var x = makeRand(100);
document.write(x()+"<br>");
document.write(x()+"<br>");
document.write(x()+"<br>");
</script>
|
| Часовой пояс GMT +3, время: 01:50. |