Générer un vrai nombre aléatoire en langage COBOL

Un des problèmes fréquemment rencontrés dans l’univers COBOL / MVS est de pouvoir générer des nombres aléatoires vraiment aléatoires.
En effet, si l’on utilise la fonction interne RANDOM seule, les valeurs aléatoires seront strictement identiques à chaque nouvelle exécution de programme, ce qui peut poser problème pour certaines utilisations.
Une solution est de se servir de l’heure actuelle comme élément sur lequel se baser pour obtenir le nombre aléatoire (en termes informatiques, on parle de graine ou en anglais de seed). En effet, l’heure change à chaque instant, ce qui est parfaitement adapté pour une génération de nombre aléatoire.

Nous allons utiliser la fonction interne CURRENT-DATE qui retourne le couple date et heure actuelles (également appelé timestamp).
Cette fonction interne retourne une chaîne de caractères au format suivant :

  • 1 à 4 : année
  • 5 à 6 : mois
  • 7 à 8 : jour
  • 9 à 10 : heure
  • 11 à 12 : minutes
  • 13 à 14 : secondes
  • 15 à 16 : millisecondes
  • 17 à 21 : informations sur le fuseau horaire

Par exemple, à l’heure où sont écrites ces lignes, la fonction CURRENT-DATE retourne la chaîne suivante :

1
2018071309404257+0200

La seule partie de la date variant de manière importante étant les millesecondes, nous allons les utiliser comme graine pour le RANDOM.
Pour rappel, pour extraire une partie d’une chaîne alphanumérique, l’utilisation de l’instruction : (deux-points) est la plus rapide. Aussi, pour extraire les millesecondes nous procéderons ainsi :

1
FUNCTION CURRENT-DATE(15:2)

En l’intégrant dans le RANDOM, cela donnera la ligne suivante :

1
FUNCTION RANDOM(FUNCTION CURRENT-DATE(15:2))

Remarque : selon l’environnement de compilation, l’utilisation de la fonction interne NUMVAL sera peut-être nécessaire pour transformer l’extraction de la date au format numérique en vue de servir en tant que graine pour le RANDOM.

Par exemple, pour obtenir un nombre aléatoire variant entre 1 et 6 (pour simuler un lancer de dé), vous procéderez ainsi (le RANDOM retourne un nombre compris entre 0 et 1) :

1
COMPUTE NOMBRE = 1 + 6 * (FUNCTION RANDOM(FUNCTION CURRENT-DATE(15:2)))

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *