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

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

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

Регистрация: Sep 2012
Сообщений: 91
Question Math.random кратный числу

Всем привет
создаю цикл,хочу что бы 10 элементов mine добавилось рандомно на поле,c этим проблем не возникает,НО мне понадобилось,что бы рандомные координаты были каждый раз кратны 30 например (то есть число выдаваемое рандомом должно делится на 30)
пока что элементы просто разбрасываются в любые координаты от 0-300.
вот такой есть код:
Код AS3:
package{
	import flash.display.MovieClip;
	public class Random extends MovieClip{
		private var n:Number;
		private var m:Number;
		public function Random () {
			for(k=0;k<10;k++){
				var mine = new Mine();
				addChild(mine);
				n=Math.floor(Math.random()*300);
				m=Math.floor(Math.random()*300);
				trace (m);
				trace(n);
				mine.x=n;
				mine.y=m;
			}
		}
	}
}
+ может кто подскажет как осуществить проверку на то что у 2-ух и более элементов mine не совпали координаты и они не наложились друг на друга.

Старый 21.10.2012, 23:06
Krusty вне форума Посмотреть профиль Отправить личное сообщение для Krusty Найти все сообщения от Krusty
  № 2  
Ответить с цитированием
Krusty

Регистрация: Jul 2007
Сообщений: 393
Код AS3:
var k:uint = 0;
		var n:uint = 0;
		var m:uint = 0;
		var grid_step:uint = 30;
		var grid_count:uint = 10;
		for(k=0;k<10;k++){
				n=Math.floor(Math.random()*grid_step*(grid_count+1));
				m = Math.floor(Math.random()*grid_step*(grid_count+1));
				n = n - n % grid_step;
				m = m - m % grid_step;
				trace (m);
				trace(n);
			}
Добавлено через 2 минуты
если вам нужно исключать дубликаты-то просто запоминайте уже примененную расстановку, при получении того же результата просто повтор continue, вместо for-while

Старый 21.10.2012, 23:22
says вне форума Посмотреть профиль Найти все сообщения от says
  № 3  
Ответить с цитированием
says
Banned

Регистрация: Sep 2012
Сообщений: 91
Цитата:
Сообщение от Krusty Посмотреть сообщение
Код AS3:
var k:uint = 0;
		var n:uint = 0;
		var m:uint = 0;
		var grid_step:uint = 30;//завели переменную шаг
		var grid_count:uint = 10;// не очень понял что за переменная
		for(k=0;k<10;k++){
				n=Math.floor(Math.random()*grid_step*(grid_count+1));
				m = Math.floor(Math.random()*grid_step*(grid_count+1));
				n = n - n % grid_step; // для чего слуэит данная комбинация,что делает %
				m = m - m % grid_step;
				trace (m);
				trace(n);
			}
Добавлено через 2 минуты
если вам нужно исключать дубликаты-то просто запоминайте уже примененную расстановку, при получении того же результата просто повтор continue, вместо for-while
спасибо,а вы не могли бы подкомментить что и как вы сделали,мне очень нужно понимание кода,для следующих работ)

Старый 21.10.2012, 23:35
Krusty вне форума Посмотреть профиль Отправить личное сообщение для Krusty Найти все сообщения от Krusty
  № 4  
Ответить с цитированием
Krusty

Регистрация: Jul 2007
Сообщений: 393
Если у вас поле 300 на 300 px, и шаг 30-то это поле 10 на 10 квадратиков, grid_count это и отражает.
% -остаток от целочисленного деления, для 35 будет так- 35-(35%30)=35-5=30. Просто забавно, задачка-то сильно простая.

Старый 22.10.2012, 00:36
says вне форума Посмотреть профиль Найти все сообщения от says
  № 5  
Ответить с цитированием
says
Banned

Регистрация: Sep 2012
Сообщений: 91
Цитата:
Сообщение от Krusty Посмотреть сообщение
Если у вас поле 300 на 300 px, и шаг 30-то это поле 10 на 10 квадратиков, grid_count это и отражает.
% -остаток от целочисленного деления, для 35 будет так- 35-(35%30)=35-5=30. Просто забавно, задачка-то сильно простая.
Дело не в этом,я понять пошагово не могу как вы это сделали.
Код AS3:
n=Math.floor(Math.random()*grid_step*(grid_count+1));
здесь вы считаем рандомное число от 0 до 1 так?
умножаем это число на
Код AS3:
grid_step
=30
умножаем полученное произведение на
Код AS3:
grid_count+1
=11
далее
Код AS3:
n = n - n % grid_step;
присваиваем значению
Код AS3:
n
n - n%grid_step - вот эту вещь вообще не понимаю

Старый 22.10.2012, 00:42
Krusty вне форума Посмотреть профиль Отправить личное сообщение для Krusty Найти все сообщения от Krusty
  № 6  
Ответить с цитированием
Krusty

Регистрация: Jul 2007
Сообщений: 393
Math.random()*30*11= диапазон от 0 до 330. Так? Так.
n = n - n % grid_step;
Берем число. Отнимаем от него целочисленный остаток от деления на 30. Получается число, кратное 30. Почему? Потому что его целочисленный остаток от деления теперь равен 0(мы как раз этот остаток и вычли).
По определению, число кратно числу, если остаток от целочисленного деления==0.
Если у вас это такие трудности вызывает, можно кучу альтернатив предложить.

Старый 22.10.2012, 00:54
says вне форума Посмотреть профиль Найти все сообщения от says
  № 7  
Ответить с цитированием
says
Banned

Регистрация: Sep 2012
Сообщений: 91
Цитата:
Сообщение от Krusty Посмотреть сообщение
Math.random()*30*11= диапазон от 0 до 330. Так? Так.
n = n - n % grid_step;
Берем число. Отнимаем от него целочисленный остаток от деления на 30. Получается число, кратное 30. Почему? Потому что его целочисленный остаток от деления теперь равен 0(мы как раз этот остаток и вычли).
По определению, число кратно числу, если остаток от целочисленного деления==0.
Если у вас это такие трудности вызывает, можно кучу альтернатив предложить.
Я пока набирал ответ,думал думал,считал,подставлял,нажал отправить и меня осенило как все работает
Почему то осознаю всё,когда на форуме вопрос начинаю писать
спасибо

Старый 22.10.2012, 00:59
udaaff вне форума Посмотреть профиль Отправить личное сообщение для udaaff Найти все сообщения от udaaff
  № 8  
Ответить с цитированием
udaaff
...

модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
Не проще так?
Код AS3:
30 * Math.floor(Math.random() * 11);

Старый 22.10.2012, 01:03
Krusty вне форума Посмотреть профиль Отправить личное сообщение для Krusty Найти все сообщения от Krusty
  № 9  
Ответить с цитированием
Krusty

Регистрация: Jul 2007
Сообщений: 393
Цитата:
Сообщение от udaaff Посмотреть сообщение
Не проще так?
Код AS3:
30 * Math.floor(Math.random() * 11);
Конечно, проще. Но скучно.

Старый 22.10.2012, 01:03
says вне форума Посмотреть профиль Найти все сообщения от says
  № 10  
Ответить с цитированием
says
Banned

Регистрация: Sep 2012
Сообщений: 91
Цитата:
Сообщение от udaaff Посмотреть сообщение
Не проще так?
Код AS3:
30 * Math.floor(Math.random() * 11);
то есть не юзать переменные вообще?

я кстати не допер почему мы берем 11 потом 12 потом 13 ... 20 для grid_count,ну это ладно)

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

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

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


 


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


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