簡體   English   中英

Math.random不斷返回相同的答案

[英]Math.random Keeps Returning the Same Answer

我對編碼和JavaScript還是很陌生,但是我將下面的代碼作為三向隨機化器編寫。 一切似乎都工作正常,除了無論我運行了多少次代碼,返回值都是“ c”插入的。 我想知道是否有人可以給我一些有關如何解決此問題的快速建議。 謝謝。

var random = function() {
  var randomizer = function() {
    Math.random() * 100
  }

  if (randomizer <= 33) {
    var compDecision = "a"
  }
  else if (randomizer > 67) {
    var compDecision = "b"
  }
  else if (33 < randomizer <= 67) {
    var compDecision = "c"
  }

  document.write(compDecision)
}

一堆事情馬上浮現在腦海:

1. JavaScript沒有隱式返回

因此,這與您的想法不符:

var randomizer = function() {
  Math.random() * 100
}

該函數返回undefined 你需要:

var randomizer = function() {
  return Math.random() * 100
}

2.括號在JavaScript函數調用中不是可選的

所以這不會做你認為:

if (randomizer <= 33) {
    var compDecision = "a"
}

您將需要:

if (randomizer() <= 33) {
    var compDecision = "a"
}

3. JavaScript沒有三向比較

因此,這與您的想法不符:

else if (33 < randomizer <= 67)

您將需要:

else if (33 < randomizer() && randomizer() <= 67)

最后,就像其他人提到的那樣,首先將randomizer定義為函數實際上沒有任何意義。 為了讓您的random函數執行您想要的操作(以大致相等的概率產生'a''b''c' ),您確實想在函數開始時產生一個隨機值並重用它:

function random() {
  var randomizer = Math.random() * 100;

  if (randomizer <= 33) {
    return 'a';
  } else if (randomizer <= 67) {
    return 'b';
  } else {
    return 'c';
  }
}

console.log(random());

希望有幫助。

您沒有正確調用randomizer函數。 我已將其刪除,因為在這種情況下它並不是必需的:

var random = function() {
    // I assume you want the comparisons below to be run against the same number
    var randomNumber = Math.random() * 100;

    if (randomNumber <= 33) {
        var compDecision = "a";
    }
    else if (randomNumber > 67) {
        var compDecision = "b"
    }
    else {
        var compDecision = "c"
    }

    return compDecision;
}

您可以將代碼簡化為:

 var randomizer = Math.random() * 100; if (randomizer <= 33) { var compDecision = "a"; } else if (randomizer > 67) { var compDecision = "b"; } else if (33 < randomizer && randomizer <= 67) { var compDecision = "c"; } alert(compDecision); 

丹濤的答案很好,此外,似乎只調用一次的單行函數似乎毫無意義,因此:

var n = Math.random() * 100;

但是, document.write部分可能應該分開,因為您可能希望以始終不適合將結果寫入當前文檔的方式調用此函數。

最后,您只需要測試三個條件中的兩個,因為如果不是前兩個條件之一,那么它必須是第三個條件。 您可以使用條件運算符:

function random() {
  var n = Math.random() * 100;
  return n <= 33? 'a' : n <= 67? 'c' : 'b';
}

document.write(random()); 

randomizer是包含函數的變量。

要了解此問題,請嘗試

alert(Math.random());

var value = randomizer(); 警報(值);

我認為,您可以按照以下方式做同樣的事情:

function Randomize(){
    rng = Math.random() * 3;
    rng = Math.round(rng);
    switch(rng) {
    case 0:
        return "a"
        break;
    case 3:
        return "a"
        break;
    case 1:
        return "b"
        break;
    case 2:
        return "c"
        break;
    };
};
alert(Randomize());

JavaScript在每個語句后都需要使用分號。 但是,如果不應該在分號后面加上/然后/否則。

if (a < 10) {
  alert("Less than ten.");
} else {
  alert("Ten or more.");
}

有時,分號會自動插入它們所屬的位置,但是您不應該依賴它-最好自己鍵入它們。

關鍵字var用於創建/聲明/初始化變量。 每個變量僅執行一次。

同樣好的做法是在包含變量的函數頂部聲明一個變量。

function() {
  var result;

  if (condition1 === true) {
    result = "a";
  } else if (condition2 === true) {
    result = "b"
  } else {
    result = "c"
  }

  return result;
}

在您的代碼中,“ randomizer”是一個函數。 要執行它並獲取它返回的值,您必須在其后加上一對括號: randomizer()

因此, randomizer <= 33並不是將兩個數字進行比較,而是將函數與數字進行比較。 randomizer > 67 因此,它們每個都評估為false

然后, 33 < randomizer <= 67計算為true 為什么? 我不確定。 但是因為它被認為是“ true”, var compDecision = "c"將執行var compDecision = "c"

這就是為什么您不斷獲得“ c”的原因。

編輯: RobG在下面的評論解釋了為什么33 < randomizer <= 67在JavaScript中評估為true

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM