Un jour, mon professeur m'a appris à utiliser randomize()
y random()
pour générer des nombres pseudo-aléatoires en C++ Builder. Maintenant je préfère travailler dans VS 2012, mais quand j'ai essayé d'utiliser ces fonctions, il m'a dit que l'identifiant n'était pas trouvé, même quand j'ai ajouté #include <stdlib.h>
. Après quelques recherches sur Google, j'ai découvert qu'il existe également des rand()
y srand()
fonctions. Quelle est la différence entre les deux et quelle est la meilleure solution ?
Réponses
Trop de publicités?Je ne connais pas randomize()
y random()
mais ils ne font pas partie de la bibliothèque standard. Vous devez éviter d'utiliser rand()
Cette vidéo explique pourquoi l'utilisation de rand() est considérée comme nuisible .
Vous devez utiliser la fonction en-tête aléatoire introduite en C++11 Voici un exemple utilisant les deux std::uniform_real_distribution y std::uniform_int_distribution :
#include <iostream>
#include <random>
int main()
{
std::random_device rd;
std::mt19937 e2(rd());
std::uniform_int_distribution<> dist(1, 6);
std::uniform_real_distribution<> distReal(1, 6);
for( int i = 0 ; i < 10; ++i )
{
std::cout << dist(e2) << ",";
}
std::cout << std::endl ;
for( int i = 0 ; i < 10; ++i )
{
std::cout << distReal(e2) << ",";
}
std::cout << std::endl ;
return 0 ;
}
Il s'agit d'une solution de contournement qui consiste à utiliser des nombres aléatoires créés en dehors de C++.
Voici le programme original en C, copié à partir de " http://www.programmingsimplified.com/ " Ce programme ne s'exécute pas car le " temp1 = 1 + random ( "temp2 = 1 + random ( 380 ) ;" ne fonctionnent pas. random" n'est pas une fonction de graphics.h, conio.h, ou stdlib.h Il ne fonctionne pas non plus si vous incluez random.h. Sous cette liste se trouve une solution de contournement pour la fonction random.
#include<graphics.h>
#include<conio.h>
#include<stdlib.h>
main()
{
int gd = DETECT, gm, area, temp1, temp2, left = 25, top = 75;
void *p;
initgraph(&gd,&gm,"C:\\TC\\BGI");
setcolor(YELLOW);
circle(50,100,25);
setfillstyle(SOLID_FILL,YELLOW);
floodfill(50,100,YELLOW);
setcolor(BLACK);
setfillstyle(SOLID_FILL,BLACK);
fillellipse(44,85,2,6);
fillellipse(56,85,2,6);
ellipse(50,100,205,335,20,9);
ellipse(50,100,205,335,20,10);
ellipse(50,100,205,335,20,11);
area = imagesize(left, top, left + 50, top + 50);
p = malloc(area);
setcolor(WHITE);
settextstyle(SANS_SERIF_FONT,HORIZ_DIR,2);
outtextxy(155,451,"Smiling Face Animation");
setcolor(BLUE);
rectangle(0,0,639,449);
while(!kbhit())
{
temp1 = 1 + random ( 588 );
temp2 = 1 + random ( 380 );
getimage(left, top, left + 50, top + 50, p);
putimage(left, top, p, XOR_PUT);
putimage(temp1 , temp2, p, XOR_PUT);
delay(100);
left = temp1;
top = temp2;
}
getch();
closegraph();
return 0;
}
Les nombres aléatoires sont générés à l'aide d'une simple macro MS Excel, listée ici :
Sub Macro1()
Dim i
For i = 1 To 400
Randomize
Range("a" & i) = Int(Rnd * 588) + 1
Range("b" & i) = Int(Rnd * 380) + 1
Next i
End Sub
Cette opération génère deux colonnes de nombres aléatoires. Chaque colonne est copiée et collée dans son propre fichier *.txt, c'est-à-dire rnd1.txt et rnd2.txt, et placé dans un répertoire où il peut être consulté. accessibles par le programme c++ qui suit. Remplacer le "c : \PATH\rnd1.txt " et " C:\PATH\rnd2.txt "avec le chemin d'accès correct.
#include<iostream>
#include<fstream>
#include<graphics.h>
using namespace std;
int i,j,k;
int main(int argc, char** argv) {
std::ifstream infile1;
infile1.open("c:\\PATH\\rnd1.txt",ios::in);
ifstream infile2;
infile2.open("c:\\PATH\\rnd2.txt",ios::in);
int gd = DETECT, gm, area, temp1, temp2, left = 25, top = 75;
void *p;
initgraph(&gd,&gm,"C:\\TC\\BGI");
setcolor(YELLOW);
circle(50,100,25);
setfillstyle(SOLID_FILL,YELLOW);
floodfill(50,100,YELLOW);
setcolor(BLACK);
setfillstyle(SOLID_FILL,BLACK);
fillellipse(44,85,2,6);
fillellipse(56,85,2,6);
ellipse(50,100,205,335,20,9);
ellipse(50,100,205,335,20,10);
ellipse(50,100,205,335,20,11);
area = imagesize(left, top, left + 50, top + 50);
p = malloc(area);
setcolor(WHITE);
settextstyle(SANS_SERIF_FONT,HORIZ_DIR,2);
outtextxy(155,451,"Smiling Face Animation ");
setcolor(BLUE);
rectangle(0,0,639,449);
while(!kbhit())
{
infile1 >> j;
temp1 = j;
infile2 >> k;
temp2 = k;
if(infile2.eof()) {
closegraph();
void close();
return 0;
}
getimage(left, top, left + 50, top + 50, p);
putimage(left, top, p, XOR_PUT);
putimage(temp1 , temp2, p, XOR_PUT);
delay(100);
left = temp1;
top = temp2;
}
}
Ce programme fonctionnera pendant environ 40 secondes, puis s'arrêtera.
- Réponses précédentes
- Plus de réponses