CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Coder une fonction random en C

Darryone
Darryone
Niveau 10
12 avril 2012 à 19:08:51

Bonjour,

Je suis en train de programmer un robot (robot Hemisson de la K-team) en langage C.

J'aimerai que certains mouvements du robot soient aléatoires et donc pour cela j'ai besoin d'une fonction qui génère un nombre aléatoire. Je ne sais pas du tout comment faire, il me semble qu'habituellement on code cela en utilisant une horloge, laquelle je ne sais pas.

Merci de votre aide.

godrik
godrik
Niveau 30
12 avril 2012 à 19:22:52

pourquoi ne pas utiliser rand(3)?

chris_27
chris_27
Niveau 10
12 avril 2012 à 19:27:29

Bonjour,

Il y a deux choses dans l'histoire :
1) générer une suite de nombre aléatoires,
2) générer des suites différentes à chaque exécution.

Pour répondre au 1, tu as la fonction C rand (définie dans le fichier stdlib.h) qui va te retourner un nombre aléatoire entre 0 et RAND_MAX. Tu peux alors utiliser modulo (disons, % 10) si tu veux un nombre entre 0 et 9.

Pour le 2, tu as la fonction srand qui prend une graine (= élément servant à initialiser la suite de nombre aléatoires retournée par des appels successifs à rand). C'est ici qu'on utilise parfois l'horloge pour obtenir la fameuse graine, ce qui donne :

  1. include <stdlib.h>
  2. include <time.h>

...

unsigned seed = time(NULL);
srand(seed); /* initialise le générateur aléatoire */

Darryone
Darryone
Niveau 10
12 avril 2012 à 19:33:02

Dans la librairie que j'utilise je n'ai pas la fonction rand(), j'utilise "16f877.h".

Darryone
Darryone
Niveau 10
12 avril 2012 à 19:35:13

Merci a vous, mais est-ce que je peux inclure <stdlib.h> et
<time.h> dans mon programme si il va être exécuté par un robot et non pas un ordinateur ? C'est la toute première fois que je programme pour un robot, et je ne suis aussi débutant en programmation en général.

godrik
godrik
Niveau 30
12 avril 2012 à 22:29:02

rand() et srand() c'est moins de 10 lignes de C dans la libc. sinon tu peux aussi trouver comment ca marche dans "numerical recipes"

Darryone
Darryone
Niveau 10
13 avril 2012 à 17:57:48

J'ai lu la doc du compiler que j'utilise (un truc exprès pour programmer sur les PIC) et ils fournissent un librairie qui contient une fonction random, donc ça devrait aller.

Par contre j'ai peur d'une chose :

Si je fais une boucle (infinie en fait c'est tout le programme qui se répète) qui appelle la fonction random à chaque fois au même endroit de la boucle (et donc à intervalle de temps régulier) je ne risque pas d'obtenir une suite de nombre aléatoire qui se répète ? Et donc un comportement de ma machine prévisible ? (si la seed de la fonction rand est basée sur le temps)

godrik
godrik
Niveau 30
13 avril 2012 à 18:10:27

Lis la doc de ta lib. Mais en pratique les fonctions aleatoires ne sont dependente que de la seed du generateur et du nombre de fois que tu as genere un nombre aleatoire. Si tu peux choisir la seed comme tu le souhaites, alors tu ne devrais pas avoir de probleme de tirage repetitifs. Le temps n'est pas un facteur prit en compte dans le tirage aleatoire.

souvent les fonction aleatoire sont implemente comme cela:

int seed;

int rand()
{
int a = SOMETHING_CONSTANT;
int b = SOMETHING_ELSE_CONSTANT;
int c = A_THIRD_CONSTANT;
seed = (a*seed+b)%c;
return seed;
}

Aucune duree n'aparrait.

Darryone
Darryone
Niveau 10
13 avril 2012 à 18:49:47

Dans la librairie j'ai srand(seed) qui me permet de changer la seed de rand() mais le problème c'est que je ne sais pas comment générer la seed de façon aléatoire.

godrik
godrik
Niveau 30
13 avril 2012 à 19:58:26

utiliser l'horloge systeme et/ou le numero du processus et/ou la temperature

Darryone
Darryone
Niveau 10
13 avril 2012 à 20:06:41

Ok merci j'ai compris, mais du coup si j'ai accès à l'horloge système ça irait pas plus vite de faire ça :

int nbAleatoire = time()%max;

avec time la fonction qui retourne l'horloge système, ça devrait de donner un nombre entre 0 et max-1

godrik
godrik
Niveau 30
13 avril 2012 à 20:08:42

oui, ca retournerait un nombre entre 0 et max-1, mais il ne serait pas "aleatoire" dans le sens qu'un ensemble d'appel successif ne sera probablement pas bien distribue dans l'intervale [0;max-1]. En d'autre terme tu pourrais avoir un nombre qui apparait beaucoup plus souvent que les autres.

chris_27
chris_27
Niveau 10
13 avril 2012 à 20:22:12

int nbAleatoire = time()%max; :d) ATTENTION, ceci n'est probablement PAS aléatoire ! Mets ça dans une boucle, et tu verras plusieurs millions de fois la même valeur de suite. Et tu ne peux pas non plus utiliser une horloge plus précise car le résultat n'est en général pas aléatoire non plus.

Par ailleurs, si tu veux faire tourner du code sur une autre machine :
0) va réviser la notion de compilation séparée, et ce que sont les fichiers .dll/.a/.so.
1) réponds à ta question : « Merci a vous, mais est-ce que je peux inclure <stdlib.h> et
<time.h> dans mon programme si il va être exécuté par un robot et non pas un ordinateur ? »
hint: im y a plusieurs solutions possibles. :-)

Sous forums
  • Aide à l'achat Mac
  • Steam Deck
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Macintosh
  • Hardware
La vidéo du moment