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 Messages postés 356 Date d'inscription mercredi 13 avril 2011 Statut Membre Dernière intervention 18 novembre 2021 - 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

jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
20 nov. 2011 à 18:24
Bonjour,

Bon ! puisque mon frère jumeau ucfoutu m'a réveillé :
J'ai déposé en effet un tout petit bout de code qui montre comment utiliser mle coup de ce fameux Sapeur Camembert :
Il est écrit en VB6, mais très facilement transposable en VB.Net
Il y a tout !
- La listbox n'y est qe pour visualiser le résultat (pas pour "tirer") et peut être remplacée par n'importe quoi d'autre à votre guise
- je n'utilise aucune collection et ne risque pas de revenir sur un tirage déjà sorti

Attention : enlever la ligne qui dit
a = a & vbCrLf & tabl(ou), que j'ai oublié d'effacer et qui ne sert à rien.
Voilà où je l'ai mis, ce petit bout de code
Je retourne dans mon coin, maintenant.
0
Utilisateur anonyme
20 nov. 2011 à 18:26
Salut Henry,

Bien vu!!!
D'accord tu m'as "cassé la baraque"
Je le refais



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 à 19:04
Active,


Comment expliques-tu alors que avec ce code:


Mais c'est 93 numéros qui doivent être produits dans un ordre peseudo aléatoire, et non 5.

Ton code boucle comme un forcené, car les petits numéros sont peu tirés, ce qui plante le prpogramme !
Ce qui est normal, il ne faut pas utiliser du textuel qui est trop long à la lecture, mais des vriables ou une liste...

Et ensuite tu n'as pas mis le code pour les récupérer et les utiliser, alors que moi y a plus qu'à dérouler v(i) en liste...

Un code élégant !

For ctr As Integer = 0 To 4


Un code inexpressif... en C

ctr -= 1
TextBox1.Text &= i & " "


...

Ben je préfère on code, il respect les règle de Basic (Qbasic), il est découpé comprégensible, gènère tout d'une coup est est ummédiatement utilisable, question de goût...

Pour le GOTO, quand c'est cette instruction qui est la plus appropriée, ne pas la mettre est un non-sens !
Fallait rester en c# ou en C si tu ne voulais pas utilier de goto, bien que, ça existe néanmoins.
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 à 19:09
Nn Henri,

Bonjour,

tu écris :


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.


Tout dépend si on veut ou pas des doublons...

Ce que je veux dire est que quand le plus simple est de mettre un goto, on en met un tout simplement. Le but n'étant pas de l'éviter à contrario de ce que tu écris, mais de le mettre si besoin.

Tu serais bien incapable de me démontrer que mon goto perturbe le code, explique ?

Cordialement, Joe.
0

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

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

Le Goto ne perturbe pas le code, mais le rend plus difficilement compréhensible.

Dans mon code, il y a aucun Goto, alors que le code rempli son office.
Dans la mesure du possible, il faut éviter Goto.
En regardant ton code, il est plus difficile de voir comment on boucle.

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 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: 


Est-ce plus clair que : ?
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


On voit beaucoup mieux comment on boucle, quelles sont les conditions qui sont appliquées.

De plus, mon système a l'avantage de ne pas boucler inutilement, générer un nombre qui est un double.

Si je reprends ton code sans Goto :
Public Function GetAleat() as Integer()
dim ltResult as List(Of Integer)=new List(Of Integer)
Dim rand As New Random()

Do While ltResult.Count<93
Dim lNb As integer=rand.Next(92)+1
if Not ltResult.Contains(lNb) then 
ltResult.Add(lNb)
end if
loop

Return ltResult.ToArray
End Function


C'est pas plus clair ?

---------------------------------------------------------------------
[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
20 nov. 2011 à 20:12
C'est en général lorsque l'on doit intervenir (pour maintenance) sur un code où règnent les Goto, que l'on se prend à maudire les spaghettis et celui qui les a mis à table.
Mais pas uniquement. Je me rappelle en avoir littéralement "bavé", ainsi que tous les autres de l'équipe que je dirigeais, lors d'une transposition (Pick étant abandonné) d'un programme écrit en Pick Basic (hé oui : je suis un vieux, moi, et je connais ce langage aujourd'hui très rarement utilisé, sauf par certaines banques) vers un autre langage, à l'aide de "passerelles".
____________________
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 à 20:20
Bonjour ucfoutu,

Connais-tu bien le PHP ?

Cordialement, Joe.
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 à 20:25
Non !
je ne connais pas du tout ce langage ...
A ce propos : quand j'ai parlé du "langage" Pick et de "passerelles", je n'ai probablement pas été asse clair.
Pick (et Pick Ultimate, les deux) n'étaient pas seulement un "langage" (Pick Basic). Ils étaient également un système d'exploitation à part entière, système d'exploitation qui était par ailleurs, "in si mismo", une base de données. Et les passerelles, à partir de Pick Ultimate, étaient pour une exploitation sous Unix, les deux systemes "cohabitant"


____________________
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
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 à 20:31
Pour que tu aies une petite idée de ce que c'était : un système d'exploitation et SGBD en lui même, entre autres
____________________
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 à 20:40
Je connais le principe j'ai commencé sous système Bull France, avec un SE nommé ProgoluE et un langag appelé BAL, les deux écrits par la même société, du temps du CPM grâce à eux j'étais déjà en multi-postes-tâches et imprimantes, MsDos n'existait pas encore !

S'ils avaient proposés à IBM un OS gratuit contre un pourcentage comme MS, ce serait la France et BULL qui serait à la place de MS, nous qui étions déjà les inventeurs d'Internet (le minitel)...

Haute trahison mettant en péril les intérêts supéieurs de la Nation, et aucn gouvernement n'a fait "effacer" les dirigeants par l'ex DGSE, lamentable de laisser des traites incompétents en liberté...
0
Utilisateur anonyme
21 nov. 2011 à 01:19
Re:
Pardon pour le retard:
        Dim Tirage As String
        Dim rand As New Random()
        Dim i As Integer
        Dim Numeros As String()
        Dim Doublon As Boolean

        For NombreDeTirages As Integer = 1 To 10
            Tirage = ""
            For ctr As Integer = 0 To 4
                Doublon = False
                i = rand.Next(93) + 1
                Numeros = Tirage.Split(New [Char]() {" "})
                For Each Chiffre In Numeros
                    If Chiffre = i.ToString Then ctr -= 1 : Doublon = True
                Next
                If Doublon = False Then Tirage &= i.ToString & " "
            Next
            Doublon = False
            For Each Ligne In ListBox1.Items
                If Ligne = Tirage Then NombreDeTirages -= 1 : Doublon = True
            Next
            If Doublon = False Then ListBox1.Items.Add(Tirage)
        Next


Dans un listbox sans doublons....

CF2i - Guadeloupe
Ingénierie Informatique
0
Utilisateur anonyme
21 nov. 2011 à 04:47
Salut, tout le monde je sorts de ma plongée,
Excusez moi mais, je viens de lire un peu la suite de la discussion, je crois Azenti, quand il va revenir il va halluciner...

Donc EhJoe:
D'abord on voit de suite ta perspicacité en m'appelant Active, après tu dis:

'Un code inexpressif... en C
ctr -= 1
TextBox1.Text &= i & " "

J'imagine que tu fais encore:
ctr = ctr - 1
TextBox1.Text = TextBox1.Text + " "

Ce qui fonctionne aussi (pour l'instant)...
Mais, aucun rapport avec le C la discussion est basée sur VB.NET.
Pour le C il faut demander à mon frère qui est enseignant en programmation à l'université.

Mais en premier tu dis:

Mais c'est 93 numéros qui doivent être produits dans un ordre peseudo aléatoire, et non 5.

Réflechit bien, qu'est ce qui t'impêche de remplacer:
For NombreDeTirages As Integer = 1 To 10 'Nombre de tirages
For ctr As Integer = 0 To 4 'Nombre de chiffres par tirage

Par:
For NombreDeTirages As Integer = 1 To 1000 'Nombre de tirages
For ctr As Integer = 0 To 93 'Nombre de chiffres par tirage


Et ça continue:
Ton code boucle comme un forcené, car les petits numéros sont peu tirés, ce qui plante le prpogramme !

Aucun rapport! ça ne veut rien dire ta phrase, sur quoi tu te bases?

J'aime bien le petit "les petits numéros sont peu tirés"... parce que tu crois que c'est moi qui les choisis? C'est aléatoire!...

Et mon "prpogramme" ne plainte pas, car je n'utilise pas un ZX Spectrum 16 mégabits (pour ceux qui connaissent), j'ai un processeur cadencé à 2.6 GHz et je ne vois pas ce qui peut le faire planter.

Je programme aussi des processeurs en assembleur et pour ce qui est des plantages je m'y connais un peu...

Bon, j'arrête parce que je me suis fait engueuler récemment par Buno pour avoir dit ce que je pense.

Bonne prog à tous...

CF2i - Guadeloupe
Ingénierie Informatique
0
Utilisateur anonyme
21 nov. 2011 à 06:24
Non pardon, je viens de me relire...

Quand tu dis "les petits numéros sont peu tirés" c'est normal j'avais une erreur dans mon code et grâce à Henry je l'ai rectifiée.

Par contre:
il respect les règle de Basic (Qbasic), il est découpé comprégensible, gènère tout d'une coup est est ummédiatement utilisable, question de goût...

Le Qbasic date de 1981... (tu avais 25 ans), et la nous parlons de VB2010.
Et concernant le "ummédiatement utilisable, question de goût...", je dis: pourquoi pas lui faire un cd avec un autorun d'installation et sans bugs aussi? il est sensé programmer comme nous...



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
21 nov. 2011 à 07:34
Bonjour acive,

Remets les choses en place :

Je donne un exemple qui tourne je présume.

Derrière tu viens, m'expliquant que tu fais mieux...

Je l'ance ton code, et je vois que c'est totalement boîteux.

Et c'est encore boîteux, au lieu de charger dans un variable immdiatement exploitable tu charges dans un texte (plus long, chacun le sait sauf toi), puis tu fais un tableau avec Split (j'ai lu rapidement), alors que le tableau moi je le fais directement...

Enfin bref, c'est toi qui est venu me dire que tu faisais mieux, pas moi, alors quand tu dis que tu fais mieux ça fait désordre quand ça ne marche même pas !

Cordialement, Joe.
0
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 4
21 nov. 2011 à 07:42
acive, suite,

Je regarde rapidement...

Tu fais des boucles 0 to 4, 1 to 10...

La boucle selon la demande et sans doublons c'est 1 to 93, en quel honneur il n'y a rien nde tel ?

Ton choix de mettre en texte puis de le lire par une instruction de comparaison de texte et d'en faire un tableau est le plus mauvais choix, le plus lent !

Alors tu y arrives (si on veut), mais question vitesse t'a encore du travail...

Cordialement, Joe.
0
Utilisateur anonyme
21 nov. 2011 à 11:43
Sans commentaire....


CF2i - Guadeloupe
Ingénierie Informatique
0
Sehnsucht Messages postés 107 Date d'inscription samedi 25 novembre 2000 Statut Membre Dernière intervention 4 mai 2013
21 nov. 2011 à 16:43
Bon comme tout le monde y est allé de son implémentation, autant mettre ma contribution (enfin j'ai dû changer d'idée, NHenry a piqué ma première idée d'implémentation ^^)
' 0.82s pour 1000000 d'éléments en moyenne sur 100 itérations
Public Function Shuffle(ByVal min As Integer, ByVal max As Integer) As Integer()
    Static rnd As New Random
    ' on multiplie la plage de rnd par 100 pour diminuer les collisions
    Dim count = max - min + 1
    Return Enumerable.
        Range(min, count).
        OrderBy(Function(n) rnd.Next(100 * count)).
        ToArray
End Function

Sinon un "brin" plus compliquée, mais environ (chez moi) 6 fois plus rapide
(implémentation du "Knuth Shuffle")
' 0.13s pour 1000000 d'éléments en moyenne sur 100 itérations
Public Function Shuffle2(ByVal min As Integer, ByVal max As Integer) As Integer()
    Static rnd As New Random
    Dim count = max - min + 1
    Dim range = Enumerable.Range(min, count).ToArray
    For i = 0 To count - 1
        Dim j = rnd.Next(count)
        Dim tmp = range(i)
        range(i) = range(j)
        range(j) = tmp
    Next
    Return range
End Function


Cordialement !

P.S. profitant de l'inférence, je n'ai pas typé explicitement toutes mes variables, mais je pense pas que cela gêne la compréhension.
0
DevLama Messages postés 356 Date d'inscription mercredi 13 avril 2011 Statut Membre Dernière intervention 18 novembre 2021 10
26 nov. 2011 à 15:54
D'abord le rnd est un fonction qui gère des nombres aléatoirement grâce l'heure de ta machine les secondes varies à chaque momment
il faut Faire :
Randmize timer avant l'instruction Rnd

0
Rejoignez-nous