# Aléatoire

Un grand moyen d’ajouter de l’intérêt à votre musique est d’utiliser des nombres aléatoires (“random”). Sonic Pi a des fonctions remarquables pour ajouter de l’aléatoire à votre musique, mais avant de commencer, nous devons apprendre une vérité choquante : dans Sonic Pi l’aléatoire n’est pas vraiment aléatoire. Qu’est-ce que cela signifie ? Eh bien, voyons-le.

## Répétabilité

Une fonction vraiment utile est `rrand` qui vous donnera une valeur aléatoire comprise entre deux nombres : un min et un max. (`rrand` est l’abréviation de “ranged random”). Essayons de jouer une note aléatoire :

    play rrand(50, 95)

Oh, une note aléatoire a été jouée. La note `83.7527` a été jouée. Une note aléatoire sympathique entre 50 et 95. Wow , attendez, est-ce que je viens juste de prédire exactement la note que vous avez obtenue ? Quelque chose de louche se passe ici. Essayez d’exécuter le code une nouvelle fois. Comment ? `83.7527` a encore été choisie ? Ce ne peut être aléatoire !

La réponse est que ce n’est pas vraiment aléatoire, c’est pseudo-aléatoire. Sonic Pi vous donne une suite d’un semblant de nombres aléatoires de manière reproductible. C’est très utile pour s’assurer que la musique que vous avez créée sur votre machine sonnera de façon identique sur n’importe quelle autre machine - même si vous utilisez de l’aléatoire dans votre composition.

Bien sûr, dans un morceau de musique donné, si `83.7527` était choisi ‘aléatoirement’ à chaque fois, ce ne serait pas très intéressant. Ce n’est cependant pas le cas. Essayez ce qui suit :

    loop do
      play rrand(50, 95)
      sleep 0.5
    end

Oui ! Ca sonne enfin aléatoire. A l’intérieur d’un run donné, des appels successifs à des fonction aléatoires retournent des valeurs aléatoires. Cependant, une nouvelle exécution produira exactement la même séquence de valeurs aléatoires et sonnera exactement pareil. C’est comme si tout le code de Sonic Pi revenait en arrière exactement au même point de départ chaque fois que le bouton “Run” était pressé. C’est le “Un jour sans fin” de la synthèse musicale !

## Cloches hantées

Une agréable illustration de l’aléatoire en action est l’exemple des cloches hantées qui fait boucler l’échantillon `:perc_bell` avec une vitesse et un temps de repos aléatoires entre les sons de cloche :

    loop do
      sample :perc_bell, rate: (rrand 0.125, 1.5)
      sleep rrand(0.2, 2)
    end

## Limite (“cutoff”) aléatoire

Un autre exemple sympathique d’aléatoire est de modifier la limite d’un son de synthé aléatoirement. Un synthé super pour essayer cela est l’émulateur du `:tb303` :

    use_synth :tb303
    loop do
      play 50, release: 0.1, cutoff: rrand(60, 120)
      sleep 0.125
    end

## Tête de série aléatoire

Alors que faire si vous n’aimez pas cette particulière séquence de nombres aléatoires que fournit Sonic Pi ? Eh bien, c’est tout à fait possible de choisir un autre point de départ via `use_random_seed`. La tête de série par défaut est 0, aussi choisissez une autre tête de série pour une expérience aléatoire différente !

Envisagez ce qui suit :

    5.times do
      play rrand(50, 100)
      sleep 0.5
    end

Chaque fois que vous exécuterez ce code, vous entendrez la même séquence de 5 notes. Pour obtenir une séquence différente, changez simplement la tête de série :

    use_random_seed 40
    5.times do
      play rrand(50, 100)
      sleep 0.5
    end

Ceci va produire une séquence différente de 5 notes. En changeant le tête de série et en écoutant les résultats, vous pouvez trouver quelque chose que vous aimez - et quand vous le partagerez avec d’autres, ils entendront exactement ce que vous avez aussi entendu.

Jetons un œil sur d’autres fonctions aléatoires utiles.

## Choix (“choose”)

Une chose très commune est de choisir un item aléatoirement dans une liste d’items connus. Par exemple, je peux vouloir jouer une note parmi les suivantes : 60, 65 ou 72. Je peux y arriver avec `choose` qui me choisit un item dans une liste. En premier, je dois mettre mes nombres dans une liste, ce qui est réalisé en les encadrant entre crochets et en les séparant avec des virgules : `[60, 65, 72]`. Ensuite, j’ai juste besoin de leur passer `choose` :

    choose([60, 65, 72])

Écoutons comment cela sonne :

    loop do
      play choose([60, 65, 72])
      sleep 1
    end

## rrand

Nous avons déjà vu `rrand`, mais examinons-le encore. Il retourne un nombre aléatoire entre deux valeurs exclues. Cela signifie qu’il ne retournera jamais soit la borne basse, soit la borne haute - toujours quelque chose entre les deux. Le nombre sera toujours un nombre flottant - ce qui signifie que ce n’est pas un nombre entier, mais une fraction de nombre. Exemple de flottants retournés par `rrand(20, 110)` :

87.5054931640625 86.05255126953125 61.77825927734375

## rrand_i

Occasionnellement, vous désirez un nombre entier aléatoire, pas un flottant. C’est là que `rrand_i` arrive à la rescousse. Il fonctionne de façon similaire à `rrand` sauf qu’il peut retourner potentiellement les valeurs minimales et maximales comme valeurs aléatoires (ce qui signifie que c’est inclusif plutôt qu’exclusif des bornes). Exemple de nombres retournés par `rrand_i(20, 110)` :

88 86 62

## rand

Cette fonction va retourner un flottant aléatoire entre 0 (inclus) et la valeur maximale que vous spécifiez (exclue). Par défaut, elle retourne une valeur entre 0 et 1. C’est par conséquent utile pour choisir une valeur de `amp:` aléatoire :

    loop do
      play 60, amp: rand
      sleep 0.25
    end

## rand_i

Similaire à la relation entre `rrand_i` et `rrand`, `rand_i` retournera un nombre entier compris entre 0 et la valeur maximale que vous spécifierez.

## dice (dé)

Quelquefois, vous souhaitez émuler un jet de dé - c’est un cas particulier de `rrand_i` où la valeur minimale est toujours 1. Un appel à `dice` nécessite que vous spécifiez le nombre de faces du dé. Un dé standard a 6 faces, donc `dice(6)` agira de manière très similaire - retournant l’une des valeurs 1, 2, 3, 4, 5, ou 6. Cependant, juste comme dans des jeux de rôle, vous pourriez trouver des dés à 4 faces, ou à 12 faces, peut-être même à 120 faces !

## one_in

Finalement, vous pouvez souhaiter simuler la chance que vous avez de tomber sur le nombre le plus élevé d’un dé, soit 6 pour un dé standard. Ainsi `one_in` retourne vrai (“true”) avec une probabilité de 1 sur le nombre de faces du dé. Par conséquent `one_in(6)` retournera vrai avec une probabilité de 1 sur 6 ou faux (“false”) autrement. Les valeurs `true` et `false` sont très utiles pour les ordres `if` que nous couvrirons dans une section suivante de ce tutoriel.

Maintenant allez et introduisez de l’aléatoire dans votre code !