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

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

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

Регистрация: Jan 2010
Адрес: Severodvinsk
Сообщений: 25
Post Генератор случайных чисел без повтора

Здравствуйте, пользователи форума flasher.ru!
Хочу задать вопрос и надеюсь на ваш ответ
Как создать генератор случайных чисел, я знаю.
Но мне непонятно, как сделать, чтобы числа не повторялись?

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

блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,113
Записей в блоге: 1
Отправить сообщение для Hauts с помощью ICQ Отправить сообщение для Hauts с помощью Skype™
Если у вас не дробные случайные числа, то записывайте "1" (или что угодно) в массив, в поле с индексом нового случайного числа. Если, когда вы получаете новое число, вы обнаруживаете, что в массиве под этим индексом уже есть запись, то генерите еще раз число, пока в массиве не останется пустых элементов (если задан диапозон случайных чисел). Это проще, чем сохранять в массив новое случайное число, и потом каждое следующее сравнивать со всем массивом.

Если дробные числа, то домножайте их на несколько порядков, чтобы получились целые.

Я не уверен, что такой способ будет оптимальным, может вам еще что-нибудь подскажут.
__________________
hauts.ru


Последний раз редактировалось Hauts; 11.01.2010 в 14:16.
Старый 11.01.2010, 14:15
gauss вне форума Посмотреть профиль Отправить личное сообщение для gauss Найти все сообщения от gauss
  № 3  
Ответить с цитированием
gauss

Регистрация: Jan 2010
Адрес: Severodvinsk
Сообщений: 25
Вы не совсем поняли
Генератор встроен в функцию, которая повторяется раз в секунду, т. е. раз в секунду генерируется новое число. Надо чтобы ОДНО число повторялось ОДИН раз. Например, если есть пять чисел, то они шли так: 1 2 3 4 5 или 3 2 4 5 1.

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

модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
Создайте массив [ 1, 2, 3, 4, 5 ]. И выбирайте из него числа. Выбранное, удаляйте из массива через Array#splice().

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

Регистрация: Jan 2010
Адрес: Severodvinsk
Сообщений: 25
Я начинающий пользователь и ПОКА ЧТО мало что понимаю в массивах
Нет конечно я знаю как создать
Но если Вы скинете код, то мои познания увеличатся!

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

блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,113
Записей в блоге: 1
Отправить сообщение для Hauts с помощью ICQ Отправить сообщение для Hauts с помощью Skype™
Код AS1/AS2:
var randoms = [];
function getRandomNum() {
	var rnd = Math.floor(Math.random()*1000);
	if (randoms[rnd] != true) {
		randoms[rnd] = true;
		return rnd;
	} else {
		return getRandomNum();
	}
}
for (var k = 0; k<100; k++) {
	trace(getRandomNum());
}
Примерно такое я имел в виду.
__________________
hauts.ru

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

Регистрация: Jan 2010
Адрес: Severodvinsk
Сообщений: 25
13:26
проверяю код...

Добавлено через 2 минуты
13:28
Ура!!! Всё работает!!!
Спасибо всем, кто мне помог!
Правда, есть небольшие нюансы, но их я додумаю сам!

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

блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,113
Записей в блоге: 1
Отправить сообщение для Hauts с помощью ICQ Отправить сообщение для Hauts с помощью Skype™
Код AS1/AS2:
var randoms = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20];
function getRandomNum() {
	var rnd = Math.floor(Math.random()*randoms.length);
	var toReturn = randoms[rnd];
	randoms.splice(rnd,1);
	return toReturn;
}
for (var k = 0; k<20; k++) {
	trace(getRandomNum());
}
Это способ от udaaff.

Вот сравнение скорости:
Код AS1/AS2:
var randoms = [];
function getRandomNum() {
	var rnd = Math.floor(Math.random()*1000);
	if (randoms[rnd] != true) {
		randoms[rnd] = true;
		return rnd;
	} else {
		return getRandomNum();
	}
}
var t1 = getTimer();
for (var k = 0; k<256; k++) {
	trace(getRandomNum());
}
trace("getRandomNum1 "+(getTimer()-t1)+"ms");
var randoms2 = [];
for (var k = 0; k<=256; k++) {
	randoms2[k] = Math.floor(Math.random()*1000);
}
function getRandomNum2() {
	var rnd = Math.floor(Math.random()*randoms2.length);
	var toReturn = randoms2[rnd];
	randoms2.splice(rnd,1);
	return toReturn;
}
var t2 = getTimer();
for (var k = 0; k<256; k++) {
	trace(getRandomNum2());
}
trace("getRandomNum2 "+(getTimer()-t2)+"ms");
У меня получилось:

getRandomNum1 3ms
getRandomNum2 40ms

Только в моем способе из-за рекурсии могут быть проблемы. Если я в чем-то ошибаюсь — поправьте
__________________
hauts.ru


Последний раз редактировалось Hauts; 11.01.2010 в 14:43.
Старый 11.01.2010, 14:38
gauss вне форума Посмотреть профиль Отправить личное сообщение для gauss Найти все сообщения от gauss
  № 9  
Ответить с цитированием
gauss

Регистрация: Jan 2010
Адрес: Severodvinsk
Сообщений: 25
Увы, не получилось...
А как сделать, чтобы згачения не выводились, а их принимало текстовое поле?
Помогите новичку плиз!

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

модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
Цитата:
Сообщение от Hauts Посмотреть сообщение
Код AS1/AS2:
var randoms = [];
function getRandomNum() {
	var rnd = Math.floor(Math.random()*1000);
	if (randoms[rnd] != true) {
		randoms[rnd] = true;
		return rnd;
	} else {
		return getRandomNum();
	}
}
for (var k = 0; k<100; k++) {
	trace(getRandomNum());
}
Примерно такое я имел в виду.
Этот способ нужно применять если количество возможных значений много больше чем возможное количество сгенерированных случайных чисел. Иначе можно превысить 256 уровней рекурсии. Даже без превышения будет много лишних вычислений.

Если значений не много, то лучше из массива выбирать:
Код AS1/AS2:
var array:Array = [ 1, 2, 3, 4, 5 ];
 
function getRandom():Number
{
	return array.splice(Math.floor(Math.random() * array.length), 1)[0];
}
 
var length:Number = array.length;
for (var i:Number = 0; i < length; i++)
{
	trace(getRandom());
}
upd: мой способ меня уже опередил


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

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

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


 


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


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