1

次のような、特定の確率で起動する関数が必要です。

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

私が取り組んでいる簡単なオンラインゲームで使用するために...

4

3 に答える 3

-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 に答える