2017-07-08 11 views
2

Angenommen, ich habe eine Funktion, die eine Zahl multipliziert mit zwei zurückgibt.Testen einer Zufallszahlenfunktion in JavaScript mit Mocha und Chai

function double(number){ 
    return number * 2; 
} 

es zu testen, mit Mocha und Chai ist einfach.

var expect = require("chai").expect; 

describe("#double", function(){ 
    it("should double a number", function(){ 
    expect(double(2)).to.equal(4); 
    expect(double(4.5)).to.equal(9); 
    expect(double(-3)).to.equal(-6); 
    }); 
}); 

Aber jetzt nehme ich habe eine Funktion, die eine Zufallszahl zwischen zwei angegebenen Zahlen zurückgibt, rufen sie min und max.

function randBetween(min, max){ 
    return Math.floor(Math.random() * (max - min + 1) + min); 
} 

Ich kann nicht vorhersagen, was der zurückgegebene Wert gleich sein wird. Ich könnte einen Test schreiben, der sicherstellt, dass der zurückgegebene Wert größer oder gleich min und kleiner oder gleich max ist, aber das prüft nicht, ob der zurückgegebene Wert zufällig ist. Gibt es eine statistisch gültige Möglichkeit für mich zu testen, ob meine randBetween Funktion funktioniert?

P.S. Ich weiß, dass die Funktion ungültige Argumente nicht behandelt, z. wenn max weniger als min ist. Bitte lassen Sie das für jetzt beiseite.

Antwort

2

Sie können es nicht mit einem einzigen Anruf testen; Sie benötigen eine große Anzahl von Aufrufen, um die Zufälligkeit zu beweisen (innerhalb einer vernünftigen Definition von Zufälligkeit).

In der großen Anzahl der Anrufe, möchten Sie auf:

  1. Stellen Sie sicher, es keine Werte außerhalb des Bereichs zurückgibt
  2. Stellen Sie sicher, es Zufallswerte innerhalb einer angemessenen Definition der Zufälligkeit nicht bieten (vorausgesetzt, es ist ein determinis PRNG)

This question and its answers gehen darüber, wie diese zu tun, auch wenn leider die Links in der akzeptierten Antwort jetzt meist tot sind.

Das Nationale Institut für Standards und Technologie hat einen ganzen Abschnitt gewidmet PRNGs, einschließlich this page describing several tests Sie verwenden könnten, um die Zufälligkeit von dem, was Sie zurück erhalten.

Natürlich, vorausgesetzt, Ihre Funktion ist korrekt implementiert (und es scheint, wenn es zurückgegeben werden soll, wie es normalerweise der Fall ist), schließlich testen Sie die Zufälligkeit der zugrunde liegenden Math.random Implementierung.

Verwandte Themen