|
Задачка по генерации чисел
Приветствую! Помогите решить задачку на генерацию чисел.
Примерно понимаю, нужно в цикле пустить Math.random Нужно сгенерировать набор из 20ти цифр (без пробелов), пример (для наглядности с пробелами): 2 10 19 15 8 0 3 5 11 17 2 1 2 0 1 0 2 1 0 2 Структура: первые 10 цифр от 0 до 19 (повторяться запрещено), следующие 10 цифр от 0 до 2 |
var data = new Array(20), i = 0, n; function getRandomInt(n) { return Math.floor(Math.random() * ++n); } while(i < 10) { n = getRandomInt(19); if(data.indexOf(n) < 0) { data[i] = n; data[i + 10] = getRandomInt(2); i++; } } alert( data ); alert( data.join('') ); |
function indexRandom(lng){ var a = {},i,out=[],n=0; while (n!=lng){ i = Math.floor(lng*Math.random()); if(typeof(a[i])=='undefined'){ a[i]=i; out.push(i); n++; } } return out; } var arr = [],ind = indexRandom(20),k; for(i=0;i<20;i++) arr[i]=ind[i]%(k=i<10?20:3); alert(arr) alert(arr.join('')) |
Deff, 3 цикла? :blink:
|
Спасибо, сейчас попробую) Я тоже начал, уже практически закончил, но косячнул видимо на проверке повторяющихся числе в первой десятке (повторяющиеся числа остаются).
//Функция генерации function randomInteger(min, max) { var rand = min - 0.5 + Math.random() * (max - min + 1) rand = Math.round(rand); return rand; } //Создаём массив var numb = []; //Начинаем заполнять массив for (i=0;i<=19;i++) { //Пошла первая десятка if (i < 10) { var my_numb = randomInteger(0, 19); numb[i] = my_numb; if (i > 0) { //Функция проверки повторов check_numb() function check_numb() { for (l=0;l<=i-1;l++) { if (numb[l] == my_numb) { alert(my_numb) numb[l] = randomInteger(0, 19); check_numb() } } } } } //Пошла вторая десятка if (i > 9) { numb[i] = randomInteger(0, 2) } } alert(numb.join('')); |
Спасибо, всё работает у вас.
Я побыдлокодил конечно, но действовал исходя из логики и недостатка знаний) |
:) random только 20 раз и никаких повторов :dance:
<script> Array.prototype.shuffle = function() { for (var a = this.length; 0 <= a; a--) { var b = Math.floor(Math.random() * (10 > a ? 3 : a + 1)), c = 10 > a || void 0 === this[b] ? b : this[b]; 10 < a && (this[b] = void 0 === this[a] ? a : this[a]); this[a] = c } return this.reverse() }; var arr = new Array(20).shuffle(); document.write(arr+"<br>"+arr.join('')) </script> |
рони, ++
Да, скоростью я был удивлён еще в табличке ================ Вариант рандомного массива без повторений с вызовом Math.random() единожды на каждый элемент: function indRand(lng){ var a = [],i,out=[],n=lng; for(i=0;i<lng;i++)a[i]=i; while (n--)out.push(a.splice(Math.floor((n+1)*Math.random()),1)[0]); return out; } var arr = [],ind = indRand(20),k; for(i=0;i<20;i++) arr[i]=ind[i]%(k=i<10?20:3); alert(arr) alert(arr.join('')) |
Deff,
на всякий случай, надобы поправить indRand, когда-то я сам прокололся на таком использовании splice :cray: |
рони,
Если массив создаешь внутри функции, вроде как фичи нет,... А вообще интересно, как оно обходит созданные прототипы и выходит на начальный родитель(ксать можно использовать(Это если массив передаём в функцию) Или ты не об этом ? Тады ап чём ? |
Часовой пояс GMT +3, время: 12:01. |
|