1
votes

Générer des nombres aléatoires uniques en javascript ou dactylographié

J'ai besoin d'obtenir un nombre aléatoire unique en javascript (ou Typescript).

En ce moment, j'utilise ce code:

var id = -((new Date()).getTime() & 0xffff);

Il me renvoie des nombres comme -13915 ou -28806 ...

Cela fonctionne la plupart du temps mais j'ai des problèmes lorsque ce code est exécuté dans des promesses (donc presque plusieurs fois en même temps). Parfois, j'ai deux identifiants identiques.

Y a-t-il une solution pour obtenir des nombres aléatoires uniques dans tous les cas?


7 commentaires

Ce n'est pas C où vous devez utiliser le temps comme graine. Vous pouvez utiliser Math.random () (qui est probablement également défini dans le temps, mais c'est bien meilleur que votre approche)


Double-possible de Numéros aléatoires uniques (non répétitifs) dans O (1)? < / a>


Également pertinent: stackoverflow .com / questions / 2380019 /… bien que la réponse acceptée ne soit pas la meilleure.


@ CristianTraìna Math.random () n'est pas garanti de vous donner des nombres uniques. Je ne sais vraiment pas pourquoi cela doit être répété tant de fois ...


Cela traitera de l'unicité Créer un GUID / UUID en JavaScript? , puis vous pourrez le transformer à un nombre si vous avez besoin d'un autre format, mais je pense que l'esprit d'unicité devrait venir de là-bas;)


Une autre option consiste à générer un identifiant global unique (GUID) . Techniquement, ils pourraient s'affronter, mais les chances sont astronomiquement faibles.


Encore une autre considération - avez-vous vraiment besoin de valeurs aléatoires ou de valeurs distinctes ? Parce que vous pouvez utiliser un horodatage - la valeur ne se chevaucherait pas avec une autre. Mais ce n'est pas «aléatoire».


5 Réponses :


0
votes

Il existe de nombreux exemples sur Internet. Vous pouvez commencer par utiliser Math.random () . Par exemple: générer un nombre aléatoire entre 1 et 100

Math.floor((Math.random() * 100) + 1);

Gardez simplement à l'esprit que ce n'est pas vraiment aléatoire; il n'est pas sécurisé par cryptographie . Vous devriez probablement chercher dans les bibliothèques si vous en avez besoin


0 commentaires

0
votes

var datetimestamp = Date.now () + Math.random (). toString (36) .substr (2, 9);


1 commentaires

var datetimestamp = Date.now () + Math.random (). toString (36) .substr (2, 9);



0
votes

Créez une fonction qui renvoie un nombre unique:

let numbers = [];

const uniqueNumber = (maxVal) => {
   const number = Math.floor((Math.random() * maxVal) + 1);
   if (!numbers.includes(number)) {
      numbers.push(number);
      return number;
   } else if (numbers.length - 1 !== maxVal) {
      uniqueNumber(maxVal);
   }
}

const randomNumber = uniqueNumber(100);
console.log(numbers) // returns all unique numbers

Cela renverra un nombre unqiue entre 1 et 100. Il s'arrête également à la longueur maximale.


0 commentaires

0
votes
  1. Math.random () en soi devrait être suffisamment sûr, avec des nombres 64 bits. Même avec un générateur imparfait, les chances de frapper deux fois le même nombre sont minuscules.

  2. Si vous recherchez spécifiquement des entiers, multipliez Math.random () par quelque chose de GRAND, comme Number.MAX_SAFE_INTEGER.

  3. Pour être parfaitement sûr, vous pouvez toujours stocker un tableau d'identifiants déjà utilisés et écrire une fonction qui dessine tant qu'elle obtient un nouveau numéro unique, le pousse dans un tableau et renvoie la valeur. Insérez toutes ces fonctionnalités dans un seul objet / fonction / classe, pour le garder propre.


0 commentaires

0
votes

Vous pouvez utiliser le package uuid :

const uuidv4 = require('uuid/v4');
uuidv4(); // ⇨ '10ba038e-48da-487b-96e8-8d3b99b6d18a'

Remarque: il s'agit d'un nombre (un nombre de 128 bits) mais il est trop grand pour être utilisé comme numéro JavaScript. Vous devez le conserver sous forme de chaîne.

Si vous en avez besoin sur le navigateur, je vous suggère de générer l'identifiant à partir d'une API exposée sur votre back-end. Des implémentations d'UUID existent dans la plupart des langues. Le package npm fonctionnera sur les navigateurs, mais il utilise ensuite une solution de secours vers Math.random a >, qui n'est pas sécurisé.

Voir aussi: Identifiant universel unique .


0 commentaires