Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Вывести случайное число от 1 до 20 (https://javascript.ru/forum/events/20963-vyvesti-sluchajjnoe-chislo-ot-1-do-20-a.html)

beliykot 23.08.2011 23:54

Вывести случайное число от 1 до 20
 
Добрый вечер!
Осваиваю javascript вторые сутки:) Возник такой вопрос:
как 20 раз вывести случайное число от 1 до 20, но с учетом того, что повторять числа нельзя

Пользователь нажимает на кнопку, при этом выводится случайная картинка, одна из 20, при следующем нажатии рядом выводится опять же случайная картинка из 19 оставшихся и так пока все 20 не будут выведены.
дошел до такого, но как теперь сделать вывод случайного числа с учетом ранее выведенных не знаю
$('button').addEvents({'mouseover': function(){
--/обработка события/--
},
'mouseout': function(){
--/обработка события/--
},
'click': function(){
var randomKart = Math.floor( Math.random( ) * (20 - 1 + 1) ) + 1;
var element  = new Element('img', {src: 'kart/'+randomKart+'.png'});
$(myDiv).adopt(element);
}

});

использовал mootools
:help:

devote 24.08.2011 00:04

var list = [];

function(){
    if ( list.length == 0) {
        for( var i = 1; i <= 20; i++ ) {
            list.push( i );
        }
    }
    var randomKart = list[ Math.floor( Math.random() * list.length ) ];
    var element  = new Element('img', {src: 'kart/'+randomKart+'.png'}); 
    $(myDiv).adopt(element);
    list.splice( randomKart, 1 );
}

beliykot 24.08.2011 00:23

Спасибо devote!!!
Как я понял реализовано так:
1.создали пустой массив
2.Проверяем массив на наличие данных, если пустой создаем там 20 элементов
3.выбираем случайный элемент из массива и используем в своих корыстных целях:))
4.удаляем выбранный элемент из массива

Еще раз спасибо!

devote 24.08.2011 00:32

да именно

devote 24.08.2011 00:34

хотя я сделал ошибку, не корыстно =)
надо так:
var list = []; 
  
function(){ 
    if ( list.length == 0) { 
        for( var i = 1; i <= 20; i++ ) { 
            list.push( i ); 
        } 
    } 
    var item_id = Math.floor( Math.random() * list.length ),
        randomKart = list[ item_id ],
        element  = new Element('img', {src: 'kart/'+randomKart+'.png'});
    $(myDiv).adopt(element); 
    list.splice( item_id, 1 ); 
}

melky 24.08.2011 10:50

var item_id = Math.floor( Math.random() * list.length ),


не боишься, что индекс попадет в длину массива? вроде нет, не попадет. или шанс всё-таки есть ?

0 <= Math.random()*list.length <*!*=*/!* list.length

devote 25.08.2011 17:51

Цитата:

Сообщение от melky
не боишься, что индекс попадет в длину массива?

Хз, миллион раз так делал, вроде не попадал :)

nikita.mmf 26.08.2011 12:53

Можно использовать еще вот такой способ, в нем не надо думать об индексах
for ( var list = [], i = 0; i < 20; ) {
	list[ i ] = ++i;
}
list.sort(function(){ return Math.random() - .5; });
  
function() { 
    var element = new Element('img', {src: 'kart/' + list.shift() + '.png'});
    $(myDiv).adopt(element); 
}

B@rmaley.e><e 26.08.2011 14:40

melky, Math.random() никогда не вернёт 1.

melky 26.08.2011 20:08

Цитата:

Сообщение от B@rmaley.e><e (Сообщение 122666)
melky, Math.random() никогда не вернёт 1.

e [0, 1);

уже посмотрел


Часовой пояс GMT +3, время: 05:34.