Salut à tous,
j'ai une petite question sur la fonction random :
est-il possible de demander à Pascal de créer un nombre aléatoire compris entre 1 et 100 par exemple, au lieu de 0 et 100 ??
Si oui, comment ?
Merci
Salut à tous,
j'ai une petite question sur la fonction random :
est-il possible de demander à Pascal de créer un nombre aléatoire compris entre 1 et 100 par exemple, au lieu de 0 et 100 ??
Si oui, comment ?
Merci
gao,
- Tu génères une valeur de 0 à 99
- tu ajoutes 1
ou bien tu mets random dans une boucle repeat until avec la condition que random(101)<>0
c'est cool ce que tu proposes sauf c'est pas du tout optimal parce que c'est du temps(je parle en des milliemes de seconde) en plus à l'ordinateur pendant l'execution à cause du test sur le repeat/until(on est tous d'accord qu'avec une instruction pareille c'est instantannée mais c'est moins rapide que ce que propose droggo) donc je te conseille plutot la methode de droggoEnvoyé par mah00
@+
Hio,
Comme te l'a dit krachik, ce n'est pas optimal d'une part, et d'autre part manque de généralité.Envoyé par mah00
Poussons un peu à l'extrême : tu veux générer une valeur 10000 <= n <= 10005.
Tu vas refaire le coup de la boucle repeat ?
Avec l'inconvénient supplémantaire que random(v) ne renvoyant que des valeurs de 0 à v, comment obtiendras-tu des valeurs négatives ?
Une saine habitude en programmation est d'essayer de faire du code le plus général (ou généralisable) possible, ce qui n'est pas toujours évident, bien entendu.
Ainsi, la méthode que j'ai proposée se généralise immédiatement pour définir une fonction renvoyant un entier compris entre 2 bornes:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 function RamdomRange(min, max : integer) : integer; var range : integer; begin { on prend la peine de vérifier que min < max, histoire de prévoir une étourderie du programmeur. si ce n'est pas le cas, on les inverse } if min > max then begin min := min xor max; max := max xor min; min := min xor max; end; { la gamme à générer, de 0 à range } range := max - min + 1; { et le résultat } RamdomRange := min + Random(range); end;
Et le plus important :
avec une boucle repeat ... until tu ne peux pas prouver que ton algorithme termine !
Bien sûr il a de fortes chances de terminer, mais rien ne peut le prouver. Si par exemple la fonction random est bugguée et que pour x ou y raisons elle renvoie toujours la même valeur : 0 sur ta machine, ton code bouclera à l'infini.
Bonjour,
Soit a, une variable qui doit avoir une valeur aléatoire comprise entre 1 et 100;Envoyé par droggo
En pascal on écrirait :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 program algorithme_de_droggo // tout à fait correct begin randomize ; a := random(100)+1 ; writeln(a) ; end.je ne suis pas d’accords:Envoyé par droggo
En effet, contrairement à ce dit droggo (sans doute un p’tit oubli), random(v) retourne une valeur comprise entre 0 et v-1;
Jui,
Oui, c'est vrai.Envoyé par Ultima
Confusion car celles que j'utilise (générateur personnel) ont le comportement que j'ai cité.
La force de l'habitude.
[b]Edité[/]
J'ai corrigé mon code pour tenir compte de cette erreur.
Si cela nous arrive un jour,on peut dire qu'on a la poisse!!Envoyé par Loceka
Autre chose,pour le temps d'execution,il est vrai que meme ces millieme de secondes ralentissent considerablement le programme,mais si c'est pour un algorithme simple,je crois qu'on peut y penser...
Parce que a force de chercher des instructions generalisable (je cite) on risque de faire de l'inutile!
Mais il est vrai qu'a un certain niveau,on ne peut pas y échapper.
Juo,
Comme petit test, je viens de vérifier : si on oublie "randomize", la version de TP7 que j'ai (prise ici) renvoie toujours 0 pour random(n).Envoyé par mah00
Ce n'est pas le cas de FreePascal, mais les valeurs semblent moins bien remplir la gamme voulue si on ne met pas randomize (ce n'est qu'une impression "à l'oeil", donc fort probablement fausse, même si ça semble assez reproductible. )
Parfois, mais c'est un bon exercice, car on apprend ainsi beaucoup de choses au passage, et surtout, si un code est prévu pour, on peut le récupérer pour usage dans d'autres programmes (c'est là un point très important).Envoyé par mah00
Sauf cas très particulier, qui peut jurer "je n'aurais jamais besoin d'un code ressemblant à ce que je fais en ce moment" ?
Moi j'ai TPW 1.5, et si je ne mets pas randomize; les valeurs données sont certes aléatoires mais elles ne changent pas d'une execution a l'autre.Mais le programme ne m'a jamais affiché 0!Envoyé par droggo
Donc ça va plutôt dans mon sens.Envoyé par mah00
Mettons que tu écrives ton programme en "oubliant" le randomize et que chez toi ça fonctionne bien avec ton compilateur.
Tu le recompiles sur un autre compilateur (TP7) ou bien tu le donnes à quelqu'un qui le recompile sous TP7, après lui avoir assuré que ça marchait chez toi et là, paf, boucle infinie.
De tout façon, un repeat ... until dans ce cas-là est bien plus mauvais qu'un addition (et aussi comme l'a dit Droggo bien moins réutilisable).
Faire une addition se fait en temps constant et en un très petit nombre de cycles processeurs.
Un repeat est un test donc l'operation ne demande pas grand chose en soit non plus mais n'est pas beaucoup moins coûteuse qu'une addition.
Donc si tu fais 2 tests ( = 2 tours de boucles) au lieu d'un tu perds déjà pas mal de temps par rapport à une simple addition.
Le problème c'est que tu n'en fais pas 1 mais un nombre aléatoire supérieur ou égal à 1. Donc la plupart du temps tu es perdant.
Bon, là tu peux dire que c'est du chipotage, qu'en réalité sur les machines actuelles ça ne fait aucune différence, eh bien non.
Mettons que tu créés une fonction qui te génére un nombre aléatoire compris entre 2 bornes et que tu te serves pour ça d'un repeat. Et mettons que tu veuilles implémenter un algorithme basé sur le hasard (par exemple un algorithme génétique).
Dans ce cas tu ne vas pas appeller ta fonction une seule fois mais de millions de fois. Et là je t'assure que tu vas sentir la différence !
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager