Вход

Просмотр полной версии : Вывести случайное число от 1 до 20


beliykot
23.08.2011, 23:54
Добрый вечер!
Осваиваю 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
не боишься, что индекс попадет в длину массива?
Хз, миллион раз так делал, вроде не попадал :)

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
melky, Math.random() никогда не вернёт 1.

e [0, 1);

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

devote
27.08.2011, 01:47
Можно использовать еще вот такой способ, в нем не надо думать об индексах

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);
}


Во первых ему нужно от 1-20, во вторых ему нужно при клике что бы выводилась случайная картинка, и не повторялись индексы, а когда они закончатся все шло заново... в твоем варианте, заново ничего не будет идти, все индексы закончатся и будет пустой массив, тоесть он не обновиться... Читай вопрос внимательнее перед тем как приводить свой пример.

nikita.mmf
29.08.2011, 13:07
devote,
специально прочитал вопрос и не нашел там место где требуется массив заполнять занова, и внимательно посмотрите код прежде чем критиковать, в list хранятся значения от 1 до 20 и каждый раз при вызове функции, будет браться число случайное число от 1 до 20, где не соответствие условию?

devote
29.08.2011, 13:22
специально прочитал вопрос и не нашел там место где требуется массив заполнять зановаВерно говоришь, видимо я автоматом додумал сам... Ибо тупо делать кнопку на которую 20 раз жмакнул и потом ошибка.
и внимательно посмотрите код прежде чем критиковатьДа не заметил сложение перед назначением.