Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Случайное число с исключением (http://www.flasher.ru/forum/showthread.php?t=174559)

Scorp2008 28.01.2012 13:06

Случайное число с исключением
 
Доброго дня.
Мне нужно получить случайное число в заданном диапазоне (ес-но функцией), но с исключением какого-либо числа, т.е. например любое число от 1 до 10, но только не 5. (1,2,3,4,6,7,8,9,10)... Имеется переменная в которой храниттся число исключение - idgame:int, также имеется функция рандома которая выдает случайное число в заданном диапазоне, а как сделать то что мне нужно - прошу помочь. Спасибо.

Функция рандома:
Код AS3:

public function random(min:Number, max:Number):Number {
  return Math.round(Math.random() * (max - min)) + min;
}


bav 28.01.2012 13:25

Первый, плохой, но рабочий вариант:
Код AS3:

public function random(min:Number, max:Number, idgame:int):Number {
  var result:int = Math.round(Math.random() * (max - min)) + min;
  while (result == idgame)
    result = Math.round(Math.random() * (max - min)) + min;
  return result;
}

Добавлено через 3 минуты
Еще вариант:
Код AS3:

public function random(min:Number, max:Number, idgame:int):Number {
  var arr:Array = [];
  for (var i:int = min; i <= max; i++) if (i != idgame) arr.push(i);
  var len = arr.length;
  return arr[int(Math.random() * len)];
}

Добавлено через 13 минут
Ждем более изящных решений :)

Scorp2008 28.01.2012 13:39

Спасибо большое :)

Zolza 29.01.2012 06:44

Код AS3:

public function randomExeption(max:Number, min:Number, exeption:Number):Number
                {
                        var mod:Number = 1;
                        var t:uint = getTimer() % 2;
                        if (!t) return Math.random() * (exeption - min) + min;
                        else return Math.random() * (max - exeption) +(exeption + mod);
                }

Переменная mod для того, чтобы точно не нарваться на исключаемое число. Для целых исключаемых подойдет 1, для вещественных можно и меньше, 0.1 например.

-De- 29.01.2012 07:10

Код AS3:

public function randomNum(min:Number, max:Number, ex:Number):Number {
        var ret:Number = Math.random() * (max - min) + min;
        if(ret == ex)
                ret = max;
        return ret;
}
public function randomInt(min:int, max:int, ex:int):Number {
        var ret:int = int(Math.random() * (max - min) + min);
        if(ret >= ex)
                ++ret;
        return ret;
 
}


TanaTiX 29.01.2012 07:25

-De-, только что наваял такой же вариант. Тольео для 2-го случая поправь возвращаемое значение на int, и в расчетах тоже, там Number не нужен.

fish_r 29.01.2012 07:58

Код AS3:

                function selectNm( max:int, min:int, ex:int ):int
                {
                        var res:int = Math.random() * ( max - min ) + min;
 
                        if ( res === ex ) res = selectNm( max, min, ex );
 
                        return res;
                }


Wolsh 29.01.2012 07:58

-De-, TanaTiX – А что, ситуации когда ex == max исторически исключаются?)

fish_r 29.01.2012 07:59

но самый прикольный напишет 2wvxvw, если конечно заглянет в тему )

TanaTiX 29.01.2012 08:50

Wolsh, тогда необходима либо дополнительная проверка, либо теряется равномерность рэндома (с учетом всех его недостатков во флеше)
fish_r, +1 :)


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

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