1

我需要一个有一定概率会触发的函数,例如:

function broken_fn ( function () { console.log( Math.random() ); }, 33 ) {
    // code...
}

用于我正在开发的简单在线游戏...

4

3 回答 3

10

怎么样:

function maybeFire (fn, probability) {
    if (Math.random() < probability) {
         fn();
    }
}    

将其用作:

maybeFire(function() { console.log('fired!'); }, .5);
于 2013-09-02T07:48:10.263 回答
0

这是不会立即触发该函数的方式,但您可以反复调用它以可能触发(没有意识到这是意图):

function getMaybeFireFunction (fn, probability) {
    return function() {
        if (Math.random() < probability) {
             fn();
        }
    };
}    

利用:

var fn = getMaybeFireFunction(function() { console.log('hello'); }, .5);
fn();
fn();
于 2013-09-02T08:20:03.427 回答
-5
    function broken_fn( fn, will_fire_probability /* 0 - 100 */ ) {

        // #helpers
        function slc( args, i1, i2 ) {
            return Array.prototype.slice.call( args, i1, i2 );
        }

        function clumpnum( num, min, max, _default ) {
          return ( Object.prototype.toString.call( num ) === "[object Number]" )
                 ? (
                    ( isFinite( num ) )
                    ? ( ( ( num >= min ) && ( num <= max ) ) || ( num = _default ), num )
                    : _default
                   )
                 : _default;
        }

        function randint( min, max, un ) {
            var r;
            return  ( min === un && max === un ) && ( Math.random() ) ||
                    (
                     ( max === un ) &&
                        ( max = min, min = 0, r = min + Math.floor( Math.random() * (max - min + 1) ), true ) ||
                        ( r = min + Math.floor( Math.random() * ( max - min + 1 ) ) )
                    ) && r;
        }



        // code

        var
            pr    = clumpnum( will_fire_probability, 0, 100, 50 ),
            args1 = slc( arguments, 2 );

        return function () {
            var out;
            ( ( pr == 100 ) || ( randint( 0, 100 ) < pr ) )
            && ( out = fn.apply( this, args1.concat( slc( arguments ) ) ) );
            return out;
        }

    }


var
    f1 = broken_fn( function () { console.log( Math.random() ); }, 25 );

f1();
f1();
f1();
f1();
f1();
f1();
f1();
f1();
f1();
f1();

//
//  0.00948742698193461
//  0.3570269207216398
//  0.01068347242658918
//
// ...
//
于 2013-09-02T07:44:39.897 回答