Случайное число Абсолют 1 или -1 - PullRequest
3 голосов
/ 31 марта 2011

Вопрос прост. Мне нужна одна строка команды, как,

Math.round((-Math.random() * 2))

, который на выходе просто показывает 1 и -1 . Я пытаюсь понять это, но это кажется не легкой задачей! Я могу использовать команду IF, как,

demo = (Math.random()>.5)?(1):(-1);

но мне нужно что-то быстрее, как математическая формула.

Ответы [ 6 ]

6 голосов
/ 31 марта 2011

Если вам нужен более быстрый способ, вы можете сделать это следующим образом:

var n:Number=(int(Math.random()>=0.5)<<1)-1.0

Как это работает: Math.random()>=0.5 вернет true или false

int(true) = 1
int(false) = 0

<<1 умножит значение на 2, поэтому у вас будет int, равный 2 или 0

, теперь вычитайте 1.0, и у вас будет number, равное 1.0 или -1.0

Вот некоторые живые испытания с их скоростью: http://wonderfl.net/c/xdqv

4 голосов
/ 31 марта 2011

Я не могу представить что-либо более быстрое, чем это:

var n:int = ((Math.random()*4)&2)-1;

Нет условий, нет сравнений, нет функций, кроме random (): -)

А вот еще один, просточтобы заставить вас задуматься о том, как это работает:

var n:int = (((Math.random()*0xFFFFFFFF) & 0x80000000)>>30) | 1;
4 голосов
/ 31 марта 2011
Math.round(Math.random())*2-1;

Но, честно говоря, это медленнее, чем условный метод.

var referenceTime:int = getTimer();
var randomInt:int;
for (var i:int=0; i < 1000000; i++)
{
    randomInt = (Math.random()>.5)?1:-1;
}

trace(getTimer()-referenceTime);  //122ms
referenceTime = getTimer();

for (i=0; i < 1000000; i++)
{
    randomInt = Math.round(Math.random())*2-1;
}

trace(getTimer()-referenceTime);   //238ms
3 голосов
/ 31 марта 2011

Ваша вторая строка (троичный оператор) - самый быстрый способ сделать это. Если вы часто это вызываете, вы можете кэшировать функцию Math.random (), например:

private var m_ran:Function = Math.random;

Или для максимально быстрого доступа вы можете предварительно сгенерировать массив из 100 (или 1000, что угодно) результатов, а затем просмотреть список, когда вам это нужно. Что-то вроде:

private var m_nums:Vector.<int> = null;
private var m_total:int         = 100;
private var m_curr:int          = 0;

private function _init():void
{
    this.m_nums         = new Vector.<int>( this.m_total, true );
    var ran:Function    = Math.random;
    for( var i:int = 0; i < total; i++ )
        this.m_nums[i] = ( ran() > 0.5 ) ? 1 : -1;
}

public function getRandom():int
{
    this.m_curr++;
    if( this.m_curr >= this.m_total )
        this.m_curr = 0;
    return this.m_nums[this.m_curr];
}
1 голос
/ 04 сентября 2014
var n:int = int(Math.random()*2) - 1 | 1;
1 голос
/ 31 марта 2011
Math.round(Math.random())*(maxValue-minValue+1))+minValue;  

По словам Йонски, может быть проблема установить -1 как целое число ...

...