1
votes

Comment créer une fonction de générateur de nombres aléatoires en utilisant JavaScript sans utiliser la fonction Math.random ()?

Je souhaite créer une fonction de générateur de nombres aléatoires en utilisant JavaScript qui renverra un nombre aléatoire entre 0 et 1. Est-il possible de créer une fonction de générateur de nombres aléatoires personnalisée sans utiliser le code Math.random () > fonction?

J'ai essayé cette approche. Cela fonctionne mais je ne sais pas si c'est vraiment aléatoire ou s'il existe un modèle?

    var lastRand = 0.5;
    function rand(){
        var x = new Date().getTime()*Math.PI*lastRand;
        var randNum = x%1;
        lastRand = randNum;
        
        return randNum;
    }

    // Output
    for(var n = 0; n < 50; n++){
        console.log(rand());
    }

Cette fonction dépend de la variable lastRand pour générer le nombre. Mais je veux un moyen plus efficace de le faire.


7 commentaires

Vous devriez vous pencher sur les techniques courantes de génération de nombres pseudo-aléatoires.


(retirant le masque chirurgical) Mais pourquoi?


Republiez! Allez trouver votre réponse ici: stackoverflow.com/questions/13442611/...


@olajensola Java! == JavaScript


J'ai trouvé ça wonderergiant.com/2013/03/random-without-math- aléatoire , cela pourrait vous aider


window.crypto.getRandomValues ​​()


Utilisez Chance Js


3 Réponses :


2
votes

Pourquoi pas de cette façon? Cela me semble plus aléatoire car il ne dépend pas d'une valeur.

var lastRand, randNum;

function rand(){
    while(randNum == lastRand)
        randNum = (new Date().getTime()*Math.PI)%1;

    return lastRand = randNum;
}

// Output
for(var n = 0; n < 50; n++)
    console.log(rand());


0 commentaires

0
votes

Il s'agit d'une version utilisant un générateur de fonctions qui ne nécessite pas de variables externes.

function *makeRand() {
  let seed = new Date().getTime()
  while (true) {
    seed = seed * 16807 % 2147483647
    yield seed / 2147483647
  }
}

// Usage
let rand = makeRand()
for (let i = 0; i < 5; i++) {
  console.log(rand.next().value)
}

// 0.05930273982663767
// 0.7011482662992311
// 0.1989116911771296
// 0.10879361401721538
// 0.4942707873388523

Source: https://www.cse.wustl.edu/~jain/iucee/ftp/k_26rng.pdf

p >


2 commentaires

C'est une bonne solution. Mais j'ai remarqué un modèle dans cette méthode. Si je recharge la page toutes les 1 seconde, je trouve un modèle comme celui-ci. 0,22 ..., 0,24 ...., 0,26 ...., 0,28 ... parmi le premier nombre.


Peut-être appelez-vous makeRand () tout le temps? Assurez-vous de stocker le rand résultant et utilisez-le pour appeler next () plusieurs fois.



0
votes

J'ai une meilleure solution. Il utilise un objet au lieu d'une variable externe.

var Random = {
    "lastRand" : 0.5,
    "randNum" : 0.5,
    "rand" : function(){
        while(this.randNum == this.lastRand){
            this.randNum = (new Date().getTime()*Math.PI*this.lastRand)%1;
        }
        return this.lastRand = this.randNum;
    }
}

for(var n = 0; n < 50; n++){
    console.log(Random.rand());
}


0 commentaires