Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 27.06.2006, 22:02
DissDoc вне форума Посмотреть профиль Отправить личное сообщение для DissDoc Найти все сообщения от DissDoc
  № 1  
Ответить с цитированием
DissDoc

Регистрация: Oct 2005
Сообщений: 80
По умолчанию random() или Math.random(). Проблемка

Вообщем! Допустим есть у меня цикл, нужно чтобы в этом цикле массив заполнился значениями неповторяющимися! Т.е. если в цикле 16итераций, то массив должен заполниться значениями от 0 до 15 случайным образом. Например такой код не работает (там есть повторы)
Код:
k = 0;
for (i = 0; i < 16; i++)
    arr[i] = Math.floor(Math.random()*16);
Есть способ заполнить массив по-моему?

Старый 27.06.2006, 22:12
Double вне форума Посмотреть профиль Отправить личное сообщение для Double Найти все сообщения от Double
  № 2  
Ответить с цитированием
Double
 
Аватар для Double

Регистрация: Mar 2001
Сообщений: 1,147
есть.
1. для понимания разницы между random() и Math.random() есть шот-кат - F1
2. для заполнения последовательности рядом в случайном порядке перебирай порядок и ищи случайные места в последовательности из числа свободных.
__________________
Кто говорит, тот не знает. Кто знает, тот не говорит.

Старый 27.06.2006, 22:18
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 3  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,884
Записей в блоге: 7
Код:
function randomOne (len) {
	var arrayNumberInit = [];
	var arrayNumber = [];
	var i;
	for (i = 0; i < len; i++) {
		arrayNumberInit[i] = i;
	}
	for (i = 0; i < len; i++) {
		arrayNumber[i] = arrayNumberInit.splice (Math.floor (Math.random () * arrayNumberInit.length), 1);
	}
	return arrayNumber;
}
trace (randomOne (4));
__________________
(и)Нильс.ru | Плагины для FlashDevelop


Последний раз редактировалось iNils; 27.06.2006 в 22:22.
Старый 27.06.2006, 22:30
Double вне форума Посмотреть профиль Отправить личное сообщение для Double Найти все сообщения от Double
  № 4  
Ответить с цитированием
Double
 
Аватар для Double

Регистрация: Mar 2001
Сообщений: 1,147
красиво.
__________________
Кто говорит, тот не знает. Кто знает, тот не говорит.

Старый 28.06.2006, 14:00
DissDoc вне форума Посмотреть профиль Отправить личное сообщение для DissDoc Найти все сообщения от DissDoc
  № 5  
Ответить с цитированием
DissDoc

Регистрация: Oct 2005
Сообщений: 80
Да. рулез )) только мне кажется. стоит Math.floor() заменить на Math.round все-таки.. так точнее

Старый 28.06.2006, 14:02
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 6  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,884
Записей в блоге: 7
Куда точнее?
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 28.06.2006, 14:09
DissDoc вне форума Посмотреть профиль Отправить личное сообщение для DissDoc Найти все сообщения от DissDoc
  № 7  
Ответить с цитированием
DissDoc

Регистрация: Oct 2005
Сообщений: 80
ну.. floor же округляет в меньшую сторону, а round по ходу решает куда округлять. Хотя точно утверждать не могу, что мой вариант точнее твоего. Все относительно.

Старый 28.06.2006, 14:13
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 8  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,884
Записей в блоге: 7
Ваш метод глупее.
Код:
function randomOne (len) {
	var arrayNumberInit = [];
	var arrayNumber = [];
	var i;
	for (i = 0; i < len; i++) {
		arrayNumberInit[i] = i;
	}
	for (i = 0; i < len; i++) {
		var t= Math.round (Math.random () * arrayNumberInit.length)
		trace (t)
		arrayNumber[i] = arrayNumberInit.splice (t, 1);
	}
	return arrayNumber;
}
trace (randomOne (4));
Вот результат трейса:
2
3
1
0
2,,1,0 < как вам такой массив?
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 28.06.2006, 16:29
DissDoc вне форума Посмотреть профиль Отправить личное сообщение для DissDoc Найти все сообщения от DissDoc
  № 9  
Ответить с цитированием
DissDoc

Регистрация: Oct 2005
Сообщений: 80
Да-да! Я тоже проверил свой метод.
Спасибо огромное за помощь. Сейчас вот пытаюсь понять почему при округлении до ближайшего целого получаются ошибочные значеня. Хотя теоретически это понятно. Так как 1,9 и 2,1 в случае round() - равны, а в floor() или ceil() повтор исключается.

Что самое интересное - то флеха генерит значения всегда в виде 1,111 или 3,1111 и т.п. и теоретически даже при округлении не должно быть ошибки =\

Старый 28.06.2006, 16:46
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 10  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,884
Записей в блоге: 7
Math.random возвращает число 0<= x < 1. Если вы умножаете его на 4 то получите 0<= x4 < 4.
Math.floor даст вам одно значение из 0,1,2,3
Math.ceil даст вам одно значение из 1,2,3,4
Элементы массива ведут свой отсчет от 0. Поэтому логично использовать Math.floor.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Создать новую тему Ответ Часовой пояс GMT +4, время: 14:00.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 14:00.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.