我需要一个有一定概率会触发的函数,例如:
function broken_fn ( function () { console.log( Math.random() ); }, 33 ) {
// code...
}
用于我正在开发的简单在线游戏...
我需要一个有一定概率会触发的函数,例如:
function broken_fn ( function () { console.log( Math.random() ); }, 33 ) {
// code...
}
用于我正在开发的简单在线游戏...
怎么样:
function maybeFire (fn, probability) {
if (Math.random() < probability) {
fn();
}
}
将其用作:
maybeFire(function() { console.log('fired!'); }, .5);
这是不会立即触发该函数的方式,但您可以反复调用它以可能触发(没有意识到这是意图):
function getMaybeFireFunction (fn, probability) {
return function() {
if (Math.random() < probability) {
fn();
}
};
}
利用:
var fn = getMaybeFireFunction(function() { console.log('hello'); }, .5);
fn();
fn();
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
//
// ...
//