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

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

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

Регистрация: Mar 2008
Сообщений: 106
По умолчанию Генерация случайного числа от 1 до 29

Как это мне сгенерировать случайное число от 1 до 29, но исключая числа 10 и 20?

Старый 28.10.2009, 16:32
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 2  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
Код AS1/AS2:
function myRand ():Number {
	var rand:Number = Math.ceil(Math.random() * 29);
	return rand;
}
//искомое число
num = myRand ();

Старый 28.10.2009, 16:44
Actual вне форума Посмотреть профиль Отправить личное сообщение для Actual Найти все сообщения от Actual
  № 3  
Ответить с цитированием
Actual

Регистрация: Jul 2009
Сообщений: 28
А разве не так?

Код AS1/AS2:
function myRand ():Number {
	var rand:Number = Math.ceil(Math.random() * 28)+1;
        if(rand == 10) rand = myRand();
        if(rand == 20) rand = myRand();
	return rand;
}
//искомое число
num = myRand ();

Старый 28.10.2009, 16:49
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 4  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
Да, я проглядел в вопросе про исключение 10 и 20.
Код AS1/AS2:
function myRand ():Number {
	var rand:Number = Math.ceil(Math.random() * 29);
	if (rand == 10 || rand == 20) {
		myRand ();
	}
	else {
		return rand;
	}
}
 
num = myRand ();
А у вас, Actual, в return все равно попадут 10 и 20.

Добавлено через 5 минут
Вот распределение, которое дает функция:
Код:
номер = 29, количество = 250
номер = 28, количество = 199
номер = 27, количество = 214
номер = 26, количество = 224
номер = 25, количество = 210
номер = 24, количество = 220
номер = 23, количество = 226
номер = 22, количество = 207
номер = 21, количество = 215
номер = 20, количество = 0
номер = 19, количество = 258
номер = 18, количество = 215
номер = 17, количество = 191
номер = 16, количество = 213
номер = 15, количество = 209
номер = 14, количество = 219
номер = 13, количество = 216
номер = 12, количество = 217
номер = 11, количество = 212
номер = 10, количество = 0
номер = 9, количество = 192
номер = 8, количество = 207
номер = 7, количество = 187
номер = 6, количество = 236
номер = 5, количество = 199
номер = 4, количество = 217
номер = 3, количество = 209
номер = 2, количество = 224
номер = 1, количество = 199
номер = 0, количество = 0

Старый 28.10.2009, 16:59
Сникерс вне форума Посмотреть профиль Отправить личное сообщение для Сникерс Найти все сообщения от Сникерс
  № 5  
Ответить с цитированием
Сникерс

Регистрация: Mar 2008
Сообщений: 106
Спасибо!
А если вот так, то нормально это будет?
Код AS1/AS2:
var chislo:Number;
while (chislo == null || chislo == 10 || chislo == 20) {
   chislo = Math.ceil(Math.random() * 29);
}
Добавлено через 3 минуты
Mooncar, а я не понял у вас вот это про распределение!


Последний раз редактировалось Сникерс; 28.10.2009 в 16:59. Причина: Надо поменять букву
Старый 28.10.2009, 17:04
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 6  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
Просто запустил функцию через setInterval и забил массив для проверки, насколько рандомность соблюдаться будет.
Да, через while компактнее будет, а с функцией можно повторно использовать. Выбор ваш.


Последний раз редактировалось mooncar; 28.10.2009 в 17:08.
Старый 28.10.2009, 17:17
Сникерс вне форума Посмотреть профиль Отправить личное сообщение для Сникерс Найти все сообщения от Сникерс
  № 7  
Ответить с цитированием
Сникерс

Регистрация: Mar 2008
Сообщений: 106
Спасибо!

Старый 28.10.2009, 17:25
Actual вне форума Посмотреть профиль Отправить личное сообщение для Actual Найти все сообщения от Actual
  № 8  
Ответить с цитированием
Actual

Регистрация: Jul 2009
Сообщений: 28
Цитата:
Сообщение от mooncar Посмотреть сообщение
А у вас, Actual, в return все равно попадут 10 и 20.
не правда. не попадут.

зато в вашем коде, когда rand выдает 10 или 20? num - undefined. Разве вы не проверяли?

Добавлено через 21 минуту
А как у вас для 0 получилось распределение 0? Функция random() же генерирует числа в промежутке [0;1).


Последний раз редактировалось Actual; 28.10.2009 в 17:49. Причина: появился ещё вопрос
Старый 28.10.2009, 17:53
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 9  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
Проверял с распределением. Но оно не показывало кое-что.
Ошибки есть и у меня и у вас.
Да, у вас с return'ом все нормально, но у вас 1 никогда не будет, а у меня, действительно, undefined бывает.
Все-таки нужно
Код AS1/AS2:
var rand:Number = Math.ceil(Math.random() * 29);
, не то
Код:
номер = 29, количество = 132
номер = 28, количество = 131
номер = 27, количество = 125
номер = 26, количество = 118
номер = 25, количество = 134
номер = 24, количество = 120
номер = 23, количество = 116
номер = 22, количество = 143
номер = 21, количество = 131
номер = 20, количество = 0
номер = 19, количество = 102
номер = 18, количество = 134
номер = 17, количество = 133
номер = 16, количество = 132
номер = 15, количество = 132
номер = 14, количество = 118
номер = 13, количество = 122
номер = 12, количество = 116
номер = 11, количество = 131
номер = 10, количество = 0
номер = 9, количество = 115
номер = 8, количество = 127
номер = 7, количество = 131
номер = 6, количество = 128
номер = 5, количество = 143
номер = 4, количество = 152
номер = 3, количество = 127
номер = 2, количество = 138
номер = 1, количество = 0
номер = 0, количество = 0
Вот как я проверял:
Код AS1/AS2:
var TEST:Array = new Array();
 
for (i = 0; i < 30; i++) {
	TEST[i] = 0;
}
 
 
function myRand ():Number {
	var rand:Number = Math.ceil(Math.random() * 29);
	if (rand == 10 || rand == 20) {
		myRand ();
	}
 
	else {
		TEST[rand]++;
		return rand;
	}
}
 
id = setInterval(myRand, 1);
 
test_btn.onRelease = function  () {
	clearInterval(id);
	for (i in TEST) {
		trace ('номер = ' + i + ', количество = ' + TEST[i]);
	}
}
Ваш вариант:
Код AS1/AS2:
var TEST:Array = new Array();
 
for (i = 0; i < 30; i++) {
	TEST[i] = 0;
}
 
function myRand ():Number {
	var rand:Number = Math.ceil(Math.random() * 28)+1;
        if(rand == 10) rand = myRand();
        if(rand == 20) rand = myRand();
		TEST[rand]++;
	return rand;
}
//искомое число
num = myRand ();
 
id = setInterval(myRand, 1);
 
test_btn.onRelease = function  () {
	clearInterval(id);
	for (i in TEST) {
		trace ('номер = ' + i + ', количество = ' + TEST[i]);
	}
}
Несколько неверно проверял.

Добавлено через 9 минут
Но вообще-то самая простая проверка дает нормальные результаты:
Код AS1/AS2:
function myRand (){
	var rand:Number = Math.ceil(Math.random() * 29);
	if (rand == 10 || rand == 20) {
		myRand ();
	}
 
	else {
		trace(rand)
	}
}
id = setInterval(myRand, 100);


Последний раз редактировалось mooncar; 28.10.2009 в 18:03.
Старый 28.10.2009, 18:22
udaaff вне форума Посмотреть профиль Отправить личное сообщение для udaaff Найти все сообщения от udaaff
  № 10  
Ответить с цитированием
udaaff
...

модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
mooncar, когда ты рекурсивно функцию myRand() вызываешь, возвращаемое значение нужно в rand записывать. А то толку от этого вызова никакого.

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

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

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


 


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


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