求一个随机算法

输入是两个数字,一个总次数,一个是成功次数。例如100次可以成功10次。

要求是一个函数 foo(),在已知这两个输入的情况下,被调用100次,始终返回10次true, 90次false

笨的办法不难找。想看看各位算法高手有没有优雅一点的。最好是javascript的

阅读 3k
4 个回答
function determinedRandom(total, pass) {
    var array = new Array(total)
        .fill(false)
        .fill(true, 0, 10)
        .sort(() => Math.random() < 0.5);
    return () => array.pop();
}

Unit Test:

var fn = determinedRandom(100, 10);
var pass = 0;

for (var i = 0; i < 100; i++) {
    if (fn())
        ++pass;
}

console.log(pass);

clipboard.png]

es6写很简洁- -

var foo = (function(){
  var pointer = -1,_result
  //创建指定长度的指定值占指定数量的数组
  var mark_arr = (num,total) => Array.from(new Array(total)).map((k,i)=>i < num)
  //数组打乱排序
  var random_arr = (arr) => arr.sort(()=>Math.random() < 0.5 ? 1 : -1)
  //调用100次的函数
  return (total,success)=>{
    if(pointer >= total) pointer = -1
    //生成指定数量数组并且打乱
    if(pointer===-1)  _result = random_arr( mark_arr(success,total) )
    //返回当前指针所在值
    return _result[++pointer]
  }
})()

翻译一下es5的结果

"use strict";

var foo = function () {
  var pointer = -1,
      _result;
  //创建指定长度的指定值占指定数量的数组
  var mark_arr = function mark_arr(num, total) {
    return Array.from(new Array(total)).map(function (k, i) {
      return i < num;
    });
  };
  //数组打乱排序
  var random_arr = function random_arr(arr) {
    return arr.sort(function () {
      return Math.random() < 0.5 ? 1 : -1;
    });
  };
  //调用100次的函数
  return function (total, success) {
    if (pointer >= total) pointer = -1;
    //生成指定数量数组并且打乱
    if (pointer === -1) _result = random_arr(mark_arr(success, total));
    //返回当前指针所在值
    return _result[++pointer];
  };
}();

用现成的随机方法,获取一个0-9的随机整数。java: Math.abs(Random.nextInteger())%10 ,判断该数是0则返回true,否则false

建立A个false的数组X(); 循环A/B次(C=0; C=C+random(B); X(C)=true)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题