1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
| /* Générateur de nombre aléatoire
A Javascript implementaion of Richard Brent's Xorgens xor4096 algorithm.
This fast non-cryptographic random number generator is designed for
use in Monte-Carlo algorithms. It combines a long-period xorshift
generator with a Weyl generator, and it passes all common batteries
of stasticial tests for randomness while consuming only a few nanoseconds
for each prng generated. http://arxiv.org/pdf/1004.3115v1.pdf and
https://github.com/davidbau/seedrandom/raw/released/
MmmF() : Nombre flottant de 32 bits < 1.0. Entre 0.0 et 1.0, 1.0 non compris
MmmB() : Nombre entre 0 et ((2^^32)-1)
MmmPf() : "Pile ou face"
MmmE(r) : Nombre entier entre 0 et une limite "r" considérée entière ("r" exclu)
MmmDf() : Retourne un flottant de 56 bits (? jamais utilisé)
ArrShuff(a) : Mélange les éléments d'un tableau "a" (Bat un paquet de ▒s)
ArrSort(a) : Trie dans l'ordre croissant les éléments du tableau "a"
ArrRSort(a) : Trie dans l'ordre décroissant les éléments du tableau "a" */
(function(wNam) { /** ### ### ### ### ### ### ### ### ### ### ### ### ### ### Random.js */
"use strict";
/// * Propriétés et méthodes privées.
const kta=[4,8,16,32,64,128,256,512,1024,2048,4096,8192,1<<14,1<<15,1<<16]
;
var _bCnt=0 // Compteur des bits en stock
,_b32 // Source des 32 bits
//,_ppese=Math.ceil // le plus petit entier supérieur ou égal à x
,_pgeie=Math.floor // le plus grand entier inférieur ou égal à x
//,_epv =Math.round // la valeur de l'entier le plus proche de x
,_w=0 // Les 3 variables qui suivent sont de la soupe à Marcel !
,_X=0 // Marcel, y dit qu'une locale, c'est traité plus vite qu'une moins locale :-)
,_i=0 // Quand je serais grand, je vérifierai ça, mais je me doute que c'est vrai.
,_mixTime=function () {
// Ici, Inverse les bits 31 à 0 (miroir)
var r=(+new Date); // Équivaut a new Date().getTime()
// ...
return r;
}
,_Rnd=function () { /// ---------------------------------------------------------------------
// Retourne un entier de 32 bits, signé
// ... résultat en r_
z_=Events.NextXor();
return r_^z_;
}
,_Seed=function (ee) { /// ------------------------------------------------------------------
// Initialise le générateur à partir de la graine "ee"
// ...
}
,_bGet=function () { /// --------------------------------------------------------------------
// Diviser par 32 le nbre de PRN utilisés pour "Pile ou Face" (O.MmmPf [mélange des ▒s])
var r_;
if (!_bCnt) { // Source à sec ?
_bCnt=31; // Il reste 32 bits disponibles
r_=(_b32=_Rnd()) & 0x80000000; // Donner le 1er résultat après avoir rechargé la source
} else
r_=_b32 & (1<<_bCnt--); // Servi !
return 0+(!!r_); // Envoyer le résultat
}
/// * Propriétés et méthodes publiques.
,O=$w$[wNam]={
// ...
,MmmF:function () { /// *********************************************************************
// Nombre flottant IN[0..1[
return Math.abs(_Rnd()%0x7FFFFFFF)/0x7FFFFFFF;
}
,MmmB:function () { /// *********************************************************************
// Nombre entier IN[0..2^^32[
return _Rnd();
}
,MmmPf:function () { /// ********************************************************************
// "Pile ou face", Return 0 ou 1 et non false ou true
return _bGet(); // Nouveau "bit à bit"
}
,MmmE:function (x) { /// ********************************************************************
// Nombre entier entre 0 et une limite "x" considérée entière ("x" exclu). Utilisé pour les
// coupes du paquet (surtout). Génération d'un mot de passe de 63 caractères :
// for(_a="",_i=0;_i<63;_i++)
// _a+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"[Rand.MmmE(62)]
// Pour prendre tous les caractères de la chaîne "ABCD
6789" au hasard et 1 seule fois :
// var _a="",_r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
// ,_n,_x=_r.length;
// while(_x>0){_a+=_r[_n=Rand.MmmE(_x--)];_r=_r.slice(0, _n)+_r.slice(_n+1)}
var i_=0, j_=0, r_=0
;
// if (isNaN(x)) debugger; // x<0 && $clog("Paramètre de MmmE < 0 ! ("+x+")");
x=_pgeie(Math.abs(x))|0; // Sécuriser le paramètre "x"
if (x<3)
r_=x>1 ? _bGet() : 0; // 0||1:->0; 2->1. Les cas simples
else {
for (; i_<kta.length && x>kta[i_]; // Trouver le nb de bits nécessaires
j_=++i_);
if (i_>=kta.length) // Si plus de 16 bits sont necessaires
r_=_pgeie(O.MmmF()*x); // On utilisera les 32 bits d'un mot
else { // Si non, similaire à MmmF mais avec "économie" de bits!
for (r_=(_bGet()<<1)+_bGet(); // Composer le PRN
i_>0;
i_--, r_|=_bGet()<<i_+2);
if (x!=kta[j_]) // Si non utilisable directement...
r_=_pgeie(r_/kta[j_]*x); // ...faire du calcul
}
}
return r_;
}
,MmmDf:function () { /// ********************************************************************
// Retourne un flottant de 56 bits (utiles ?) WARNING Jamais testée
var _t, _b, _r
;
do {
_t=_Rnd()>>>11;
_b=O.MmmF();
_r=(_t+_b)/0x200000; // (1<<21) plus rapide que 0x200000 ?
} while (!_r);
return _r;
}
,ArrShuff: function (a) { /// ***************************************************************
// Mélange les éléments d'un tableau "a" (Battait un paquet de ▒s)
// a.sort(function() { return O.MmmPf() ? 1 : -1; }); // Trop couteux !
// for (i_=0; i_<32; i_++) Rand.ArrShuff(_pak); est très couteux en chaos: 1024 bits ! Cette
// nouvelle fonction pour un tableau de 32 valeurs consomme 16*5+8*4+4*3+3*2+2 bits c'est-à-
// dire 80+32+12+6+2 bits -> 132 bits. (mais 129 mesurés !)
var t_=a.length, k_=a.concat() // Clonage de _pak
;
for(a=[]; t_; ) // réponse "à neuf",
a.push(k_.splice(Rand.MmmE(t_--), 1)[0]); // Rand.MmmE(_t) pos. dans k_ de la valeur
return a;
}
,ArrSort: function (a) { /// ****************************************************************
// Trie dans l'ordre croissant les éléments du tableau a
a.sort(function (a, b) { return(a-b); }); // Done !
}
,ArrRSort: function (a) { /// ***************************************************************
// Trie dans l'ordre décroissant les éléments du tableau a
a.sort(function (a, b) { return(b-a); }); // Done !
}
}; // Fin de la définition de l'objet "O"
/// *************************************************** Initialisation de PRNG avec la graine
_Seed(); // Initialisation du générateur String (+new Date)+"\0" -> "1651621280579\u0000")
}("Rand")); |
Partager