0
votes

PowerShell: générer des chaînes numériques semi-aléatoires uniques

Exigence: générer 10 000 numéros uniques composés d'un nombre séquentiel (16 chiffres) suivi d'une chaîne numérique aléatoire (4 chiffres). L'arme de choix est PowerShell parce que c'est le seul outil que j'ai une connaissance très limitée de.

problèmes rencontrés:

  1. générer des nombres séquentiels 10K à l'aide de la méthode suivante: 14000000000000000000 et une variable. ERREUR: la valeur est trop grande pour un int32
  2. générant 10k de 4 chiffres via get-aléatoire -minum minimum 0001 -maximum minimum 9999 et les mettre dans une variable. Je ne parviens que pour obtenir 1 nombre aléatoire.
  3. Combinant les deux variables à l'aide de l'objet Join (ou au moins c'est ce que j'espère pouvoir faire)

    Comment puis-je combiner ces 3 commandes pour obtenir une liste de nombres semi-aléatoires tels que spécifiés ci-dessus? Ou est-il plus simple d'obtenir le même résultat?


1 commentaires

Pouvez-vous partager votre code jusqu'à présent?


3 Réponses :


0
votes

L'algorithme classique pour créer une séquence unique consiste à mettre toutes les valeurs dans un tableau. Choisissez une valeur. Déplacez la dernière valeur du tableau dans l'endroit où vous venez de choisir la valeur. Ensuite, diminuez la taille de la matrice par une. Cela crée une copie du tableau, donc s'il y a beaucoup de valeurs, méfiez-vous des coûts supplémentaires causés par la redimensionnement d'un tableau.

Un exemple que les valeurs de 0 à 19 sont de même, P> XXX PRE>

Étant donné que la valeur ne correspond pas à int32, utilisez INT64. Pour ajouter les valeurs mélangées, une boucle fonctionne comme SO, P>

PS C:\> $big
1400000000000015
1400000000000006
1400000000000010
1400000000000017
1400000000000009
1400000000000004
1400000000000005
1400000000000016
1400000000000014
1400000000000003
1400000000000001
1400000000000002
1400000000000013
1400000000000011
1400000000000012
1400000000000019
1400000000000000
1400000000000007
1400000000000008
1400000000000018


0 commentaires

2
votes
14000000000000004965
14000000000000010114
14000000000000026382
14000000000000038644
14000000000000045435
14000000000000052051
14000000000000061801
14000000000000077046
14000000000000087791
14000000000000098090
14000000000000102712
....

0 commentaires

1
votes

La réponse de fer fournit une solution élégante.

Permettez-moi de le compléter en adressant des points 1. et 2. individuellement :

re 1.

.. , Opérateur de plage prend en charge uniquement [int] ( système.int32 < / Code>) (numériques) Les points d'extrémité (Incidemment, la même chose s'applique à LINQ's plage méthode).

Vous pouvez utiliser la méthode foreach () matrice pour contourner le problème, comme également montré dans la réponse de fer. xxx

re 2.

PowerShell [noyau] prend maintenant en charge le paramètre -Count pour < code> get-aléatoire qui vous permet de demander un nombre donné de nombres aléatoires entre les limites spécifiées. xxx

pas E: la valeur -Maximum (contrairement au -Minimum ) est non -inclusive; c'est-à-dire que le nombre aléatoire le plus élevé pouvant être renvoyé est 1 inférieur , 9998 .

dans windows PowerShell , vous "LL doit appeler get-aléatoire dans une boucle: xxx

appeler une cmdlet dans une boucle est chère; Vous pouvez accélérer les choses sensiblement en utilisant le System.Random < / code> classe .NET directement: xxx


1 commentaires

Noté. Ces commentaires facilitent la compréhension des seuls opérateurs.