Intégration d'une valeur aléatoire dans une liste

pascal82

XLDnaute Occasionnel
Bonjour à tous,

Je n'arrive pas à Intégrer une valeur aléatoire dans une liste définie

Prenons un exemple concret :

En AC3, je sélectionne le nombre de ligne sélectionnée. Ici 11 pour ce cas
En AC4, je sélectionne le nombre de valeur aléatoire à changer, ici 1 pour ce cas
Pour la première colonne, comme le nombre de ligne est 11, alors récupération des 11 valeurs, c'est à dire : 23, 26, 29, 30, 34, 36, 41, 43, 45, 46 et 48
Le min est 23, le max est 48. Je dois intégrer une valeur aléatoire entre le min et le max n'appartenant pas à cette liste en remplacement d'une valeur existante. De plus la liste restituée doit être rangée dans l'ordre chronologique.
Restitution en colonne AF, en lieu et place du 30, j'ai intégré le 31

Merci par avance pour vos contributions

Cordialement
 

Pièces jointes

  • test.xlsm
    23.2 KB · Affichages: 92

pascal82

XLDnaute Occasionnel
Bonsoir sousou,

En effet dans un premier temps la colonne "A" est sélectionnée.
En AC3, je demande de sélectionner les 11 premières valeurs, c'est à dire c'est à dire : 23, 26, 29, 30, 34, 36, 41, 43, 45, 46 et 48
En AC4, je demande de sélectionner 1 seul nombre aléatoire entre 23 et 48 (min et max de la liste), et de remplacer une des valeurs de la liste.
La liste triée sera collée en AF.
Cette méthode est à reproduire sur les autres colonnes du tableau

Merci

J'ai commencé ce petit bout de code mais je suis très loin du résultat

Code:
Option Explicit
   
Sub essais()
Dim nb_ligne%, pLigne()
Dim i%, j%, k%, nb_col%
Dim min%, max%, Nb%
Dim nombre_aleatoire%

nb_ligne = Range("AC3").Value  'ajout pour définir les lignes selectionnées
ReDim pLigne(1 To nb_ligne)

'nb_col = 1
    'For i = 1 To nb_col
        For j = 1 To nb_ligne

            k = k + 1
            pLigne(j) = Range("A1").Offset(k, 0).Value 'copie du tableau 1 colonne

        Next j
    'Next i
'''''Vérification    les données sont écrites en colonne CA """""""""""
For j = 1 To nb_ligne
Range("CA1").Offset(j, 0).Value = pLigne(j)
Next

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'Nombre aléatoire
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
min = Range("a2").Value
max = Range("a12").Value
Nb = Range("ac4").Value
Randomize

'''''vérification    les aléas sont notés en CC
For Nb = 1 To Nb
nombre_aleatoire = Int((max - (min + 1)) * Rnd) + 1
Range("cc1").Offset(Nb, 0).Value = nombre_aleatoire
Next
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'verifier que le ou les nombres aléatoires ne sont pas dans la liste


'selection d'une des valeur de la liste et la remplacer par nombre aléatoire



'trier et écrire de la liste



End Sub
 
Dernière édition:

sousou

XLDnaute Barbatruc
Bonjour
Dans le fichier joint j'utilise une nouvelle feuille et sa fonction sort pour trier les données.
Tu ne pas expliqué quelle valeur tu voulais supprimer(une des valeurs?)
Pour le moment , la valeur est donc ajoutée à la liste, et je range le tout en ("ae14") pour que tu puisses voir.
Pour le nombre de valeurs à changer, j'attends ta réponse qui va conditionner le résultat.
Par exemple pour le deuxième nombre à changer, faut-il reprendre la liste de départ ou celle modifié par le premier nombre?
 

Pièces jointes

  • aleatest.xlsm
    42 KB · Affichages: 57

pascal82

XLDnaute Occasionnel
Bonjour sousou, le forum,

Je viens de regarder avec intérêt ta proposition. La ou les valeurs ajoutées doivent être comprises entre la première et dernière valeur sélectionnée, et ne pas être en doublon. De plus, la ou les valeurs ajoutées remplacent une ou des valeurs sélectionnées au hasard entre la deuxième et avant dernière valeur sélectionnée

Pour reprendre l'exemple initial : 11 valeurs récupérées : 23, 26, 29, 30, 34, 36, 41, 43, 45, 46 et 48. Choix d'une valeur aléatoire 31 (pas en doublon avec la liste). Choix aléatoire de la valeur 30 dans la liste (comprise entre 26 et 46). La valeur 31 remplace la valeur 30 ce qui donne la nouvelle liste de 11 valeurs: 23, 26, 29, 31, 34, 36, 41, 43, 45, 46 et 48

Avec deux valeurs a changer sur cette même liste: choix 25 et 40 (pas de doublon avec la liste initial). En remplacement de deux valeurs choisies 30 et 34. Ce qui donne la nouvelle liste suivante : 23, 25, 26, 29, 36, 40, 41, 43, 45, 46 et 48.

Encore un grand merci pour ta participation

Cordialement
 

sousou

XLDnaute Barbatruc
une difficulté:
dans la solution à deux valeurs et plus, La deuxième valeur aléatoire pourrait être la même que la première? (pas de doublon sur la liste initial)
Il faut donc entrer la première valeur trouvée en supplément de la liste avant de trouver la seconde???
 

pascal82

XLDnaute Occasionnel
Re,

Problème pas facile à résoudre en effet (et ce n'est que la première partie du problème). Pour le contourner, il est nécessaire de vérifier que le premier nombre aléatoire ne soit pas un doublon avec une valeur de la liste initiale et ensuite le stocker dans une liste (L). Le deuxième et n ieme nombre aléatoire créé ne doit pas être un doublon avec la liste initiale ainsi qu'avec les valeurs stockées dans la liste L sinon recréation d'un autre nombre aléatoire et refaire le test.

Je me rends compte que ce problème est compliqué à résoudre et à mettre en "musique"

Cordialement
 

sousou

XLDnaute Barbatruc
RE
Une solution basée sur une suite de collection, à examiner de très pret.
Mais attention il existe des solutions impossibles ou le nombre de valeur aléatoire est trop grand par rapport au nombre de ligne , ou qu'il ny à pas assez de place entre val min et val max pour y intercaler d'autres valeurs
C'est difficile à expliquer,mais j'ai mis un arrêt pour controler.(sinon ca tourne, et ca tourne....)
Par exemple si tu mets 5 lignes et 2 valeurs tu bloquera en colonne 8
A suivre
 

Pièces jointes

  • aleatest.xlsm
    42.8 KB · Affichages: 57

pascal82

XLDnaute Occasionnel
Bonjour sousou, le forum

Merci pour la proposition, c'est un travail excellent. Reste un petit problème, le remplacement des valeurs initiales par les valeurs aléatoires doit absolument se réaliser à l'intérieur de l'encadrement min et max de la liste, ne surtout pas changer les valeurs des extrémités.

Merci encore pour ta contribution et le temps passé.

Cordialement
 

sousou

XLDnaute Barbatruc
En choisissant un rangt compris entre 2 et le nombre de ligne, et en choisissant une valeurmin= valeurmin+1 et une valeur max = valmax+1
Tu devrais arriver au résultat souhaité!?!?
J'ai ajouté une visualisation des états intermédiaires pour que tu puisses tester
 

Pièces jointes

  • aleatest.xlsm
    45.2 KB · Affichages: 59

pascal82

XLDnaute Occasionnel
Bonjour sousou,

Encore merci pour ton travail. Cependant toujours une anomalie. Dans le fichier joint, lors de plusieurs tests, tu remarqueras les anomalies (BB44 à BV44). Le nombre de données aléatoires ne corresponde pas au critère AC4

Encore un grand merci pour ta contribution

Cordialement
 

Pièces jointes

  • aleatest_anomalie.xlsm
    47.1 KB · Affichages: 52

sousou

XLDnaute Barbatruc
Re bonjour
Pas sans mal!
En fait l'utilisation de collection n'étaient peut-être pas le plus simple.
En tous cas, dans le cas des remplacements des valeurs un (remove va changer le rangt de toutes les autres valeurs de la collection...)
C'était ca qui n'allais pas
J'ai donc transformé ta collection en table pour pouvoir travailler correctement, et je la retransforme en collection pour ne pas avoir à tout refaire
Ctrl en fin de programme affiche les étape intermédiaire
Crtl n sur la première cellule du tableau de résultat efface les résultats

(Par curiosité ca sert à quoi ton tableau?)
 

Pièces jointes

  • aleatest.xlsm
    61.6 KB · Affichages: 50

pascal82

XLDnaute Occasionnel
Re,

Je veux bien admettre que la tache n'était pas facile et sans toi je n'y serais pas arrivé, encore un grand merci. Il faut reconnaitre que ton travail est du grand art. Je vais tenter de comprendre la méthode que tu as employée.

Concernant l'utilité, j'ai construis un modèle d'apprentissage de type "neurone artificiel" ou "perceptron" (en toute modestie et avec beaucoup de temps et d'énergie). Maintenant, je dois définir pour un nombre d'itération définie, sa capacité à ne plus restituer le modèle attendu.

Bonne journée et encore merci
 

Discussions similaires