Understanding “randomness”

前端 未结 28 1975
轻奢々
轻奢々 2020-11-22 15:28

I can\'t get my head around this, which is more random?

rand()

OR:

rand() * rand()

I´m f

28条回答
  •  南笙
    南笙 (楼主)
    2020-11-22 16:01

    Assuming that rand() returns a number between [0, 1) it is obvious that rand() * rand() will be biased toward 0. This is because multiplying x by a number between [0, 1) will result in a number smaller than x. Here is the distribution of 10000 more random numbers:

    google.charts.load("current", { packages: ["corechart"] });
    google.charts.setOnLoadCallback(drawChart);
    
    function drawChart() {
      var i;
      var randomNumbers = [];
      for (i = 0; i < 10000; i++) {
        randomNumbers.push(Math.random() * Math.random());
      }
      var chart = new google.visualization.Histogram(document.getElementById("chart-1"));
      var data = new google.visualization.DataTable();
      data.addColumn("number", "Value");
      randomNumbers.forEach(function(randomNumber) {
        data.addRow([randomNumber]);
      });
      chart.draw(data, {
        title: randomNumbers.length + " rand() * rand() values between [0, 1)",
        legend: { position: "none" }
      });
    }
    
    
    
    Generating chart...

    If rand() returns an integer between [x, y] then you have the following distribution. Notice the number of odd vs even values:

    google.charts.load("current", { packages: ["corechart"] });
    google.charts.setOnLoadCallback(drawChart);
    document.querySelector("#draw-chart").addEventListener("click", drawChart);
    
    function randomInt(min, max) {
      return Math.floor(Math.random() * (max - min + 1)) + min;
    }
    
    function drawChart() {
      var min = Number(document.querySelector("#rand-min").value);
      var max = Number(document.querySelector("#rand-max").value);
      if (min >= max) {
        return;
      }
      var i;
      var randomNumbers = [];
      for (i = 0; i < 10000; i++) {
        randomNumbers.push(randomInt(min, max) * randomInt(min, max));
      }
      var chart = new google.visualization.Histogram(document.getElementById("chart-1"));
      var data = new google.visualization.DataTable();
      data.addColumn("number", "Value");
      randomNumbers.forEach(function(randomNumber) {
        data.addRow([randomNumber]);
      });
      chart.draw(data, {
        title: randomNumbers.length + " rand() * rand() values between [" + min + ", " + max + "]",
        legend: { position: "none" },
        histogram: { bucketSize: 1 }
      });
    }
    
    
    
    
    
    
    
    Generating chart...

提交回复
热议问题