25.12.2015, 03:26
|
Аспирант
|
|
Регистрация: 04.08.2015
Сообщений: 59
|
|
Задачка по генерации чисел
Приветствую! Помогите решить задачку на генерацию чисел.
Примерно понимаю, нужно в цикле пустить 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
Последний раз редактировалось Untropee, 25.12.2015 в 04:23.
|
|
25.12.2015, 04:01
|
|
Профессор
|
|
Регистрация: 30.04.2012
Сообщений: 3,018
|
|
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('') );
|
|
25.12.2015, 04:05
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
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, 25.12.2015 в 14:34.
|
|
25.12.2015, 04:07
|
|
Профессор
|
|
Регистрация: 30.04.2012
Сообщений: 3,018
|
|
Deff, 3 цикла?
|
|
25.12.2015, 04:12
|
Аспирант
|
|
Регистрация: 04.08.2015
Сообщений: 59
|
|
Спасибо, сейчас попробую) Я тоже начал, уже практически закончил, но косячнул видимо на проверке повторяющихся числе в первой десятке (повторяющиеся числа остаются).
//Функция генерации
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(''));
Последний раз редактировалось Untropee, 25.12.2015 в 04:20.
|
|
25.12.2015, 04:16
|
Аспирант
|
|
Регистрация: 04.08.2015
Сообщений: 59
|
|
Спасибо, всё работает у вас.
Я побыдлокодил конечно, но действовал исходя из логики и недостатка знаний)
Последний раз редактировалось Untropee, 25.12.2015 в 04:18.
|
|
25.12.2015, 09:46
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,126
|
|
random только 20 раз и никаких повторов
<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>
Последний раз редактировалось рони, 25.12.2015 в 09:59.
|
|
25.12.2015, 17:31
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
рони, ++
Да, скоростью я был удивлён еще в табличке
================
Вариант рандомного массива без повторений с вызовом 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, 26.12.2015 в 16:26.
|
|
26.12.2015, 13:20
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,126
|
|
Deff,
на всякий случай, надобы поправить indRand, когда-то я сам прокололся на таком использовании splice
|
|
26.12.2015, 13:51
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
рони,
Если массив создаешь внутри функции, вроде как фичи нет,...
А вообще интересно, как оно обходит созданные прототипы и выходит на начальный родитель(ксать можно использовать(Это если массив передаём в функцию)
Или ты не об этом ? Тады ап чём ?
|
|
|
|