Suivez les fils RSS
 
Auteur
Pages :
Changaco
# 09 Jan 2007 - 21:02:38
Citer
951 Posts
(reprise du message précédent)

Ça y est moi c'est fait.
Modifié par Changaco (02 Dec 2007 - 10:15)

http://changaco.net/ 
^
Changaco
# 13 Jan 2007 - 16:50:07
Citer
951 Posts
Bon, voilà ce que j'ai fait :
function randomNumbers(listLength, minNumber, maxNumber, floatPrecision, enableDoubles){

var aNumbers = new Array(listLength);
var randomNumber = new Number();
var i=0;

if(!floatPrecision) floatPrecision=0;

if(Math.abs(minNumber)>Math.abs(maxNumber)) var realMaxNumber = Math.abs(minNumber);
else var realMaxNumber = Math.abs(maxNumber);
var randomNumberLength = String(Math.abs(realMaxNumber)).length+floatPrecision;

if(minNumber==0){
if(listLength>((Math.pow(10, (floatPrecision-1))+1)*(maxNumber-minNumber))&&enableDoubles===false){
alert('Impossible !');
return false;
}
}
else{
if(listLength>((Math.pow(10, (floatPrecision-1)))*(maxNumber-minNumber))&&enableDoubles===false) return false;
}

while(i<listLength){
i++;
randomNumber = String(Math.random()).slice(0, (randomNumberLength+4));
randomNumber = Math.round(randomNumber*(((maxNumber-minNumber)*Math.pow(10, randomNumberLength))/(1-Math.pow(10, (-(randomNumberLength+4))))))*Math.pow(10, (-randomNumberLength))-((maxNumber-minNumber)/2)+((maxNumber+minNumber)/2);
if(floatPrecision===0){
if(randomNumber<0) randomNumber = String(randomNumber).slice(0, (String(Math.abs(Math.round(randomNumber))).length+floatPrecision+1));
else randomNumber = String(randomNumber).slice(0, (String(Math.abs(Math.round(randomNumber))).length+floatPrecision));
}
else {
if(randomNumber<0) randomNumber = String(randomNumber).slice(0, (String(Math.abs(Math.round(randomNumber))).length+floatPrecision+2));
else randomNumber = String(randomNumber).slice(0, (String(Math.abs(Math.round(randomNumber))).length+floatPrecision+1));
}

if(enableDoubles===false){
if(isDouble(aNumbers, String(randomNumber), floatPrecision)===true){
i--;
}
else{
aNumbers[i-1] = Number(randomNumber);
}
}
else {
aNumbers[i-1] = Number(randomNumber);
}
}

alert('Result : '+aNumbers);

}
function isDouble(aNumbers, randomNumber, floatPrecision){
if(randomNumber==='0'&&floatPrecision!=0) return true;
for(var j=0; j<aNumbers.length; j++){
if(aNumbers[j]==randomNumber){
return true;
}
}
return false;
}


J'attends les critiques des modérateurs ( et des autres membres du forum bien sûr ).

Note : Ça ne fonctionne pas sur IE 7 chez moi, ça donne quoi chez vous ?
Modifié par Changaco (02 Dec 2007 - 10:16)

http://changaco.net/ 
^
DarkHerumor
# 13 Jan 2007 - 17:00:41
Citer
Ha ouais mince...
62 Posts
Heu... pour faire des random entier j'utilise ça moi... ça marche bien mais je sais pas, c'est peut-être pas propre ou autre?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script type="text/javascript">
function test()
{
temp=Math.random();
temp=temp*1000;
temp=Math.floor(temp);
temp=temp%50;
temp=temp+1;
alert (temp);
}
</script>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Rand</title>
</head>

<body>
<a href="javascript:test();">Rand!</a>
</body>
</html>


^
Changaco
# 13 Jan 2007 - 17:06:45
Citer
951 Posts
Ça m'a l'air bien c'est juste que ma fonction a plus d'arguments et de possibilités ...

Après quand on veut juste un truc tout con c'est sûr qu'on en revient au problème des librairies, il y a plein de trucs qui ne servent à rien ...

Édit : En fait ma fonction est plus "mathématiquement logique" que la tienne ...
Modifié par Changaco (02 Dec 2007 - 10:16)

http://changaco.net/ 
^
DarkHerumor
# 13 Jan 2007 - 17:15:46
Citer
Ha ouais mince...
62 Posts
Bah moi j'utilise pour simuler de dés, on peu sans soucis y rajouter des paramètres:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script type="text/javascript">
function jetdé(nbdé,dé)
{
var res = 0;
for(var i=0;i<nbdé;i++)
{
temp=Math.random();
temp=temp*1000;
temp=Math.floor(temp);
temp=temp%dé;
temp=temp+1;
res+=temp;
}
alert ("Résultat de "+nbdé+"D"+dé+" : "+res);
}
</script>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Rand</title>
</head>

<body>
<a href="javascript:jetdé(2,6);">Rand! 2D6</a><br />
<a href="javascript:jetdé(5,4);">Rand! 5D4</a>

</body>
</html>

C'est vrai que c'est pas autant optimisé que ton code (enfin je pense) mais pour un rand(0-50) ça marche bien smile

^
Changaco
# 13 Jan 2007 - 17:18:49
Citer
951 Posts
Je sais pas si mon code est optimisé mais il a plus de fonctionnalités comme les doublons, les nombres flottants et un intervalle donné ( y compris en nombres négatifs ).

Je n'ai plus qu'à attendre les critiques des modérateurs ...
Modifié par CNeo (13 Jan 2007 - 17:21)

http://changaco.net/ 
^
Changaco
# 02 Dec 2007 - 14:57:19
Citer
951 Posts
Je repensais à ce topic l'autre jour et je me suis rappelé qu'au final il n'avait pas débouché sur un post dans le topic des scripts utiles ...

Je viens donc raviver la flamme en postant une version améliorée du script que j'avais posté à l'époque.

function isDouble(aNumbers, randomNumber, floatPrecision){
if(randomNumber==='0'&&floatPrecision!=0) return true;
for(var j=0; j<aNumbers.length; j++){
if(aNumbers[j]==randomNumber){
return true;
}
}
return false;
}
function randomNumbers(listLength, minNumber, maxNumber, floatPrecision, enableDoubles){

var aNumbers = new Array(listLength);
var randomNumber = new Number();
var i=0;

if(!floatPrecision) floatPrecision=0;

if(enableDoubles===false){
if(floatPrecision==0 && listLength>(maxNumber-minNumber+1) || floatPrecision!=0 && listLength>((Math.pow(10, (floatPrecision)))*(maxNumber-minNumber)+maxNumber-minNumber)){
alert('Impossible !');
return false;
}
}

while(i<listLength){
i++;
randomNumber=Math.floor(Math.random()*((maxNumber-minNumber)*Math.pow(10, floatPrecision)+1))*Math.pow(10, -floatPrecision)+minNumber;
if(floatPrecision===0) randomNumber = String(randomNumber).slice(0, String(Math.floor(randomNumber)).length);
else randomNumber = String(randomNumber).slice(0, String(Math.floor(randomNumber)).length+floatPrecision+1);

if(enableDoubles===false){
if(isDouble(aNumbers, String(randomNumber), floatPrecision)===true){
i--;
continue;
}
}
aNumbers[i-1] = Number(randomNumber);
}
alert('Result : '+aNumbers);
}

Modifié par Changaco (15 Jan 2011 - 14:19)

http://changaco.net/ 
^
Changaco
# 02 Dec 2007 - 15:23:25
Citer
951 Posts
Par rapport à la méthode du modulo elle n'est valable que dans certains cas particuliers.

http://changaco.net/ 
^
Changaco
# 02 Dec 2007 - 19:41:25
Citer
951 Posts
Je repasserais demain soir pour poster ma solution dans le topic des scripts utiles si personne n'a mieux à proposer ...

Édit : Bon bah je post mon script ...
Modifié par Changaco (03 Dec 2007 - 19:45)

http://changaco.net/ 
^
Pages :