Fonction aleatoire

azenti Messages postés 1 Date d'inscription samedi 29 octobre 2011 Statut Membre Dernière intervention 19 novembre 2011 - 19 nov. 2011 à 15:57
 DevLama - 26 nov. 2011 à 15:54
javascript:void(0);
slt a tous j'ai un problème.En fait je suis buté sur le fait que je ne sais pas comment générer un nombre de façon aléatoire sans qu'il ne se répète.je doit générer a partir de la fonction rnd un nombre compris entre 1 et 93 sans qu'un nombre déjà afficher ne se répète.merci de votre aide

38 réponses

Sehnsucht Messages postés 107 Date d'inscription samedi 25 novembre 2000 Statut Membre Dernière intervention 4 mai 2013
19 nov. 2011 à 16:06
Bonjour,

Au lieu de chercher à générer un nombre dans ton intervalle sans répétition (faisable mais très peu performant car nécessite un test de vérification après chaque "génération" de nombre) ; essaies plutôt de partir d'un "tableau" (ou liste ou autre conteneur) contenant les différentes valeurs possibles, et génère un nombre aléatoire représentant une position du tableau, ensuite tu n'as qu'à récupérer le nombre à cette position, le supprimer le tableau et recommencer tant que le tableau n'est pas vide

Cordialement !

P.S.: code volontairement non présent, afin de plus te permettre de trouver par toi-même, ce qui est toujours plus valorisant.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 nov. 2011 à 16:19
Bonjour,
La fonction Rnd n'étant présente sous VB.Net (qui connait la classe Random) que pour assurer la compatibilité avec des applis précédemment développées sous VB6 ===>>
J'ai un doute sur ton outil de développement-.
Es-tu certain de ne pas finalement développer sous VB6 ou sous VBA de MsOffice ?


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
19 nov. 2011 à 16:34
Bonjour,

ucfoutu, si l'espace de nom Microsoft.VisualBasic est importé, je crois que Rnd passe quand même, mais en .NET, c'est mieux d'éviter d'utiliser cet espace de nom.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
0
Utilisateur anonyme
19 nov. 2011 à 16:39
Salut,

L'exemple de MSDN pour .NET dans CE LIEN

Cordialement



CF2i - Guadeloupe
Ingénierie Informatique
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
19 nov. 2011 à 16:48
Bonjour,

Je préfèrerais plutôt :
http://msdn.microsoft.com/en-us/library/system.random.aspx
Ensuite, une collection listant les nombres possibles pour retourner une valeur une seule fois.

Acive, tu as changé ton avatar ?

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 nov. 2011 à 16:50
Bonjour, NHenry,

Oui, j'avais contrôlé et bien vu cette "héritage" avant d'écrire mon message.
Je demeure malgré tout interrogateur, car assez étonné de ce que azenti, apparemment débutant, utilise d'emblée une fonction "héritée"
J'attends donc malgré tout sa réponse.

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Utilisateur anonyme
19 nov. 2011 à 16:51
OUII!... Bien vu Henry... d'où tu nous sorts ces liens?...


CF2i - Guadeloupe
Ingénierie Informatique
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
19 nov. 2011 à 17:00
Bonjour,

Acive, Avec Google en précisant "MSDN" devant le nom de la classe/fonction cherchée

Azenti, On attends ta réponse.

Ucfoutu, Je pense que sur le net, les sujets traitant de VB.NET en utilisant des fonctions VB6 sont encore légions, donc, sa recherche vient peut être de là.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
0
Utilisateur anonyme
19 nov. 2011 à 17:05
Oui, pas bête... je marque toujours VB et j'ai toujours 50 réponses sans rapport...

Et oui nous sommes curieux de voir ton code Azenti.



CF2i - Guadeloupe
Ingénierie Informatique
0
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 4
20 nov. 2011 à 14:46
Bonjour Mes Seigneurs,

Moi je ne comprends toujours rien à ce forume, le chemin est :

Accueil > Forum > VB.NET et VB 2005 > Divers > General
> fonction aleatoire

VB5000 c'est vbNet5 (2005), car en vbNet je crois qu'il y a 2008, 2008, 2010 et désormais 2011, non ?
Donc c'est du vbNet\divers\
Donc question en vbNet divers et général (hum , c'est éloquant " divers et général")...

Le Roi là, je veux dire le chef, il pourrait pas demander aux mâitre de nous faire des forums corrects, soit :
- vb6 et inférieur
- vbNet 5 et supérieurs
???

*

Le temps, ben la première des choses comme susdit est de prendre une variable indicée, ainsi :


dim v (93) as integer
dim plein as boolean
dim g as integer
for i = 1 to 93
 v(i) = 0  ' charge à RAZ
next i
genere:
' g = GENERATION DU NOMBRE ENTIER 1 A 93 ICI '
plein = true
for i = 1 to 93
 if v(i) = 0 then  
  plein = false
  exit for
 end if
next i
if plein = true then goto fin ' tableau terminé
for i = 1 to 93
 if v(i) = g then ' existe then goto genere
next i
for i = 1 to 93 ' attribue
 if v(i) = 0 then 
  v(i) = g
  goto genere
 end if
next i
fin: 
' On utilise ensuite le tableau v(i) ...



*

Le code VB est :



Dim hasard As Integer
bis:
Randomize
hasard = Int((93 - 1 + 1) * Rnd + 1)



Mais on peut aussi faire du personnel


Dim h As Integer
Dim alternat as boolean = false
bis:
alternat = not alternat
if alternat true then h now.second + 1 ' 1 à 60
if alternat false then h now.second + 31 ' 31 à 90
' ?
goto bis
' ?
if ? goto fin
' ?
fin:



Cordialement, Joe.
0
Utilisateur anonyme
20 nov. 2011 à 15:32
Salut,

Pourquoi compliquer ce qui est simple?...
Si vous aurais lu la page MSDN que Henri vous a envoyé, vous aurais fait comme ça:
Dim rand As New Random()
Dim i As Integer
For ctr As Integer = 0 To 4
    i = rand.Next(93) + 1
    If InStr(TextBox1.Text, i.ToString, CompareMethod.Text) > 0 Then
       ctr -= 1
    Else
       TextBox1.Text &= i & " "
    End If
Next



CF2i - Guadeloupe
Ingénierie Informatique
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
20 nov. 2011 à 16:32
Bonjour,

Quand je vois des Goto en VB, j'en pleure ...

Voici ma proposition (codé à l'arrache, mais l'idée est là) :
Public Function GetAleatoire() as Integer()
Dim rand As New Random()
Dim i As Integer
Dim lLstNb as List(Of Integer)=new List(Of Integer)
dim lResult as List(Of Integer)=new List(Of Integer)

For i=1 to 93
lLstNb.Add(i)
next i

Do while lLstNb.Count>1
i=rand.Next(lLstNb.Count-1)
lResult.Add(lLstNb(i)
lLstNb.RemoveAt(i)
Loop

lResult.Add(lLntNb(0)

Return lResult.ToArray()
End Function


---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
20 nov. 2011 à 16:34
Sur la ligne :
lResult.Add(lLntNb(0)
Il manque un )
lResult.Add(lLntNb(0))

---
Mon site
0
Utilisateur anonyme
20 nov. 2011 à 16:42
Salut Henry,

Toi aussi tu as compliqué la chose.
Mon code est plus simple, testé, sans chiffres en double et les valeurs entre 1 et 93 uniquement.
Par contre je ne connais pas le nombre de chiffres qu'il veut (j'en ai mis 5, comme le loto)

Teste-le... j'ai été surpris de simplicité du code.




CF2i - Guadeloupe
Ingénierie Informatique
0
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 4
20 nov. 2011 à 17:22
GoTo, instruction
Crée une branche inconditionnelle vers une ligne spécifiée d'une procédure.
0
Utilisateur anonyme
20 nov. 2011 à 17:39
Salut Joe,

Remarque de MSDN:

Les instructions GoTo peuvent rendre le code difficile à lire et à gérer. Si possible, utilisez à la place une structure de contrôle. Pour plus d'informations, consultez Flux de contrôle en Visual Basic.

Dans CE LIEN



CF2i - Guadeloupe
Ingénierie Informatique
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
20 nov. 2011 à 17:48
Ouais...
Quand vous aurez fini, je demanderai à mon frère jumeau de venir vous exposer le coup du Sapeur Camembert. Vous verrez
mais j'attends d'abord que le demandeur, seul absent, se manifeste.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 4
20 nov. 2011 à 17:52
Avis à la populacione

Un GOTO bien placé peut petre la seule façon rationnelle de remonter le code, par ailleurs, pacé à bon excient il est largement préférable à des abus d'appels de procédure et fonction, ou à des tests conditionnels en surnombre.

Si vous n'aimez pas les goto n'en dégoutez pas les autres
0
Utilisateur anonyme
20 nov. 2011 à 17:57
Re:

Comment expliques-tu alors que avec ce code:
Dim rand As New Random()
Dim i As Integer
For ctr As Integer = 0 To 4
    i = rand.Next(93) + 1
    If InStr(TextBox1.Text, i.ToString, CompareMethod.Text) > 0 Then
       ctr -= 1
    Else
       TextBox1.Text &= i & " "
    End If
Next


On arrive au résultat attendu sans un seul goto?


CF2i - Guadeloupe
Ingénierie Informatique
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
20 nov. 2011 à 18:09
Bonjour,

GOTO en .NET peut être replacé dans la majorité des cas par un Exit ou un Continue.

Acive, mon code a l'avantage de n'utiliser que le nombre de tirage nécessaire pour lister.

D'autre part, ton code pose un problème, car si tu tires dans ce sens par exemple :
32, 56, 42, 95, 3, 12
Le 3 ne sera pas pris en compte car il est déjà présent alors que ce n'est pas logique.

De fait utiliser une collection pour lister les nombres est préférable.
Tu pourra utiliser le membre IndexOf pour vérifier l'existence de la valeur.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
0
Rejoignez-nous