Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > SAS Base
SAS Base Forum d'entraide sur SAS base : étape data, procédures non statistiques, procédures non graphiques, SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/06/2011, 08h34   #1
Invité de passage
 
Inscription : juin 2011
Messages : 2
Détails du profil
Informations forums :
Inscription : juin 2011
Messages : 2
Points : 1
Points : 1
Par défaut Boucle do while infinie

Bonjour à tous!

Je souhaiterais simuler une partie de pile ou face (pipé, car la proba ne vaut pas 1/2): le joueur joue tant qu'il n'a pas atteint la ruine ou bien son gain espéré.
Seulement voilà: ma boucle tourne indéfiniment!
Voici mon programme:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
proc iml;
 
capital=100;
mise=10;
gainsouhaite=120;
cumul=capital;
nbreussites=0;
 
 
do while (0< cumul<gainsouhaite);
	alea=2*(rand('BERNOULLI',18/37))-1;
	cumul=cumul + alea*mise;
	print alea cumul;
end;
 
 
IF cumul=gainsouhaite then nbreussites=nbreussites+1;
 
print nbreussites;
 
quit;
En fait, ma boucle ne s'arrête pas dès qu'elle atteint 0 ou 120!

Autre question:
je suis passé par la proc IML car le langage matriciel m'est plus familier.
Mais comment écrire ceci dans une étape data? Si je l'exécute au sein d'une étape data, j'ai bien le bon nombre de variables mais aucune ligne créée...

Merci d'avance pour votre aide.
Ironxynalate est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/06/2011, 09h07   #2
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 823
Points : 2 823
Pour la boucle infinie : il faut écrire la condition en 2 éléments distincts :
Code :
do while (0< cumul & cumul<gainsouhaite);
En étape DATA : je pense que tu ne connais pas encore l'instruction OUTPUT, qui force SAS à écrire dans la table en sortie les valeurs des variables qu'il a en mémoire. C'est l'équivalent de tes PRINT en IML.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
DATA work.des ;
capital=100;
mise=10;
gainsouhaite=120;
cumul=capital;
nbreussites=0;
do while (0< cumul & cumul<gainsouhaite);
	alea=2*(rand('BERNOULLI',18/37))-1;
	cumul=cumul + alea*mise;
	OUTPUT ; /* écrit dans la table en sortie*/
end;
IF cumul=gainsouhaite then nbreussites=nbreussites+1;
OUTPUT ; 
RUN ;
Bon week-end.
Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/06/2011, 10h25   #3
Invité de passage
 
Inscription : juin 2011
Messages : 2
Détails du profil
Informations forums :
Inscription : juin 2011
Messages : 2
Points : 1
Points : 1
Bonjour Olivier,

Merci pour votre réponse!

J'ai réussi à programmer mes parties de pile ou face sur un grand nombre de simulations, avec des macro-variables.
Le voici pour ceux que cela intéressent:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
 
%let capital=10000;
%let mise=100;
%let gainsouhaite=11000;
%let nbsimul=1000000;
 
DATA simul;
 
nbreussites=0;
do i= 1 TO &nbsimul;
cumul=&capital;
 
do while (0< cumul &  cumul<&gainsouhaite.);
	alea=2*(rand('BERNOULLI',18/37))-1;
	cumul=cumul + alea*&mise.;
end;
IF cumul=&gainsouhaite. then nbreussites=nbreussites+1;
 
end;
 
 
run;
Ce programme renvoie une table simul avec juste une ligne ayant le résultat final. Il fait 1000000 simulations.
Sinon, si on veut tout le détail des simulations , effectivement, il faut utiliser output à la fin de la boucle i. On aura ainsi une table à 1000000 de lignes.

Merci encore à vous, et très bonne journée!
Ironxynalate est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h26.


 
 
 
 
Partenaires

Hébergement Web