【问题标题】:How to call a random function one time in Javascript?如何在Javascript中一次调用随机函数?
【发布时间】:2017-02-24 03:46:40
【问题描述】:

我有 3 个函数,我希望能够随机运行它们,而不用超过两次。这是我快速整理的一些代码:

    function func1() {
        alert("1");
    }

    function func2() {
        alert("2");
    }

    function func3() {
        alert("3");
    }

【问题讨论】:

  • 你试过什么?您提供的代码甚至没有尝试调用任何函数。如果您没有时间尝试,我为什么要花时间为您做呢?
  • 如果你把你所有的函数都放到一个数组中,就会变成一个“如何从数组中取出随机项”的问题。我相信在 StackOverflow 上已经有了答案。
  • 我尝试使用 Math.random 生成一个随机数,然后使用 if 来查找该数字是否与变量匹配。问题是我必须一遍又一遍地重复使用它,并且必须从它可以提取的数字列表中手动删除数字。
  • funcs = [func1, func2, func3]; funcs[Math.floor(Math.random() * funcs.length)]();.
  • 我有一个解决方案,我只是在手机上...我可以尽快提交。

标签: javascript


【解决方案1】:

勾选此项。
如果您只想执行一次,请只调用一次execute();。如果您需要更多时间,请相应地致电。

function func1() {
   alert("1");
}

function func2() {
   alert("2");
}

function func3() {
    alert("3");
}
function random(){
  var i  = Math.floor(Math.random()*20)%4;
  if(i<=0) return random();
  return i;
}
function execute(){
  var i = random();
  eval('func'+i+'()');
}
execute();
execute();
execute();

【讨论】:

  • 好的,谢谢。只是几个问题(我是 javascript 新手):你能解释一下这两行吗: eval('func'+i+'()'); var i = Math.floor(Math.random()*20)%4;
  • 如果它适合您,请将其标记为答案将帮助未来的访问者
  • 这对我不起作用......它有时会重复相同的功能两次,甚至可能重复三次......
  • 运行代码 sn-p 5 次以上。存在百分比错误。
  • 我们无法预测随机值。在此示例中,我们选择 1、2、3 值。所以概率是存在的。我将编辑我的答案,请稍候
【解决方案2】:

先做一个数组:

var myArray = ["func1", "func2", "func3"]

然后洗牌:

function shuffle(array) {
  var currentIndex = array.length, temporaryValue, randomIndex;

  // While there remain elements to shuffle...
  while (0 !== currentIndex) {

    // Pick a remaining element...
    randomIndex = Math.floor(Math.random() * currentIndex);
    currentIndex -= 1;

    // And swap it with the current element.
    temporaryValue = array[currentIndex];
    array[currentIndex] = array[randomIndex];
    array[randomIndex] = temporaryValue;
  }

  return array;
}
shuffle(myArray)

最后,使用这个 for 循环:

for (var i = 0; i < myArray.length; i++) {
    if (myArray[i] == "func1") {
        func1();
    }
    else if (myArray[i] == "func2") {
        func2();
    }
    else if (myArray[i] == "func3") {
        func3();
    }
}

希望这有帮助:)

*我知道有一个可接受的响应,我只是介绍一个替代方案。

【讨论】:

  • javascript 是一种客户端语言,您给客户端带来了沉重的负担。这是非常糟糕的方法
  • @SagarV 比公认的答案更好......它使用 eval() EVAL IS EVIL。但如果它那么糟糕,请检查我的答案,它与此类似但“更轻”
  • @TaylorSpark eval 在 JavaScript 中并不邪恶。推荐阅读:stackoverflow.com/a/197823/2427065
  • @SagarV 使用 eval 是不好的约定,并且在使用时,停靠点脱离了诸如 PyLint3 和 JSLint 之类的 linter。 eval 不是邪恶的,只是不好的约定。
  • @SagarV 正如 Assafi 所说,eval() 是危险的,它存在许多安全风险,远远超过大多数使用“危险”方法。如果您将 eval 放在一个函数中而不放置一个永久值,并且这也可以被绕过,您实际上可以让任何人完全访问您网站的内部 JS,如果它在 PHP 上运行,它可以用来发送危险功能和代码到您的网站。如果您想实际使用 eval(),则切换到 Math.#() 函数,并使用 window[]();通过字符串获取函数和变量
【解决方案3】:

您可能想要运行以下算法:

你有 N 个函数 - 随机运行以从 N 个函数中挑选一个。

从数组中删除它(你不必实际删除它,你可以做向量的“删除”的 C++ 技巧,即将它移到后面并更新一个类似元素的迭代器)。运行 Random 从 N - 1 中选择一个。

继续迭代直到完成数组。简单的 O(N) 解决方案。

在我的 Chrome、Linux Ubuntu 16.10 版本 54.0.2840.71(64 位)上,接受的解决方案无法正常工作。它不会只运行每个函数一次。例如它将运行 1、1、3。

【讨论】:

    【解决方案4】:

    与 Assafi 的回答类似,您可以使用带有数组的 Math.random() 轻松完成此操作。

    目前最好的(与已接受的答案不同)没有 eval() !!!

    首先创建一个数组,(如果添加重复值,从技术上讲,您可以创建一个函数将在另一个函数上执行的“百分比”或“更高/更低的机会”。

    
    // F1 and F2 have equal chances of Activating, while F3 is Rare.
    
    // Remove Duplicates for them ALL to have an Equal Chance.
    var array = ['F1','F1','F2','F2','F3']
    

    接下来,您要使用带有 If 语句的函数以及 Array Randomizer。

    var ranFunc;
    
    function start() { // Randomly Execute Function
     ranFunc = array[Math.floor(Math.random() * array.length)];
     if (ranFunc == 'F1') {
      // do stuff
     }
     if (ranFunc == 'F2') {
      // do stuff
     }
     if (ranFunc == 'f3') {
      // do stuff
     }
    }
    

    【讨论】:

      【解决方案5】:

      只需将您的函数组织在一个数组中,使用随机生成器,然后根据随机数拼接数组。

      这样,您将只调用每个函数一次。

      function func1() {
          alert("1");
      }
      
      function func2() {
          alert("2");
      }
      
      function func3() {
          alert("3");
      }
      
      var funcs = [
          func1,
          func2,
          func3
      ]
      
      function execute() {
          var i = Math.floor(Math.random() * funcs.length)
          funcs.splice(i-1, 1)[0]()
      }
      
      
      execute()
      execute()
      execute()

      【讨论】:

      猜你喜欢
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-20
      相关资源
      最近更新 更多