iota
Sous BSD et OSX, vous pouvez utiliser jot pour renvoyer un seul nombre aléatoire ( -r
) de l’intervalle min
à max
, inclus.
$ min=5
$ max=10
$ jot -r 1 $min $max
Problème de distribution
Malheureusement, la portée et la distribution des nombres générés aléatoirement sont influencées par le fait que jot utilise en interne une arithmétique en virgule flottante à double précision en interne et printf (3) pour le format de sortie, ce qui entraîne des problèmes d’arrondi et de troncature. Par conséquent, les intervalles min
et max
sont générés moins fréquemment, comme indiqué:
$ jot -r 100000 5 10 | sort -n | uniq -c
9918 5
20176 6
20006 7
20083 8
19879 9
9938 10
Sous OS X 10.11 (El Capitan), cela semble avoir été corrigé:
$ jot -r 100000 5 10 | sort -n | uniq -c
16692 5
16550 6
16856 7
16579 8
16714 9
16609 10
et...
$ jot -r 1000000 1 10 | sort -n | uniq -c
100430 1
99965 2
99982 3
99796 4
100444 5
99853 6
99835 7
100397 8
99588 9
99710 10
Résoudre le problème de distribution
Heureusement, il existe plusieurs solutions de contournement pour les anciennes versions d’OS X. La première consiste à utiliser la conversion d’entiers printf (3). Le seul inconvénient est que l'intervalle maximum devient maintenant max+1
. En utilisant le formatage entier, nous obtenons une distribution juste sur tout l'intervalle:
$ jot -w %i -r 100000 5 11 | sort -n | uniq -c
16756 5
16571 6
16744 7
16605 8
16683 9
16641 10
La solution parfaite
Enfin, pour obtenir un résultat juste des dés en utilisant la solution de contournement, nous avons:
$ min=5
$ max_plus1=11 # 10 + 1
$ jot -w %i -r 1 $min $max_plus1
Devoir supplémentaire
Voir jot (1) pour les détails mathématiques et le formatage, ainsi que de nombreux autres exemples.