Comment puis-je générer de façon aléatoire un numéro à 10 chiffres en ruby?
En outre, comment puis-je formater une chaîne de zéros?
Vous devez vous connecter pour publier un commentaire.
En outre, comment puis-je formater une chaîne de zéros?
Vous devez vous connecter pour publier un commentaire.
Pour générer le numéro d'appel rand, avec le résultat de l'expression "10 puissance 10"
À la map, le nombre de zéros, vous pouvez utiliser le format de la chaîne de l'opérateur
ou la
rjust
méthode de chaîne de0000000000
. Est-il un moyen pour éviter cela?Je voudrais contribuer probablement une solution plus simple, je sais, ce qui est un très bon truc.
rand
peut peut retourner une valeur float aussi bas que0.0
, et la chaîne résultante serait"0"
. Si vous souhaitez confirmer, essayez ceci dansirb
en exécutant(0.0).to_s[2..11]
.C'est un moyen rapide de générer un 10 taille de la chaîne de chiffres:
Array.new(10) { rand(10) }
join
La plus simple, la réponse serait probablement
rand(1e9...1e10).to_i
La
to_i
partie est nécessaire parce que1e9
et1e10
sont en fait des flotteurs:puts Benchmark.measure{(1..1000000).map{rand(1e9...1e10).to_i}}
J'ai réellement besoin d'une chaîne de caractères comme mon résultat final, mais même en y ajoutant.to_s
à la fin, correspond toujours à un résultat plus rapide.puts Benchmark.measure{(1..1000000).map{rand(1e9...1e10).to_i.to_s}}
10000.times.map{rand(1e9...1e10).to_i.to_s}.select!{|x| x.start_with?("0")}
rendements []NE PAS UTILISER
rand.to_s[2..11].to_i
Pourquoi? Car ici, c'est ce que vous pouvez obtenir:
et puis:
Noter que:
Qui n'est pas ce que vous avez prévu!
Pour vérifier que l'erreur dans votre code, au lieu de
.to_i
vous pouvez l'envelopper comme ceci:et très bientôt, il va s'avérer que:
Il est donc toujours préférable de s'en tenir à
.center
, mais gardez à l'esprit que:peut parfois vous donner
0
.Pour éviter que:
qui retournera toujours quelque chose à l'intérieur
1..9
gamme.Je suis heureux que j'ai eu de bons tests et j'espère que vous allez éviter la rupture de votre système.
Simplement parce qu'il n'était pas mentionné, le
Kernel#sprintf
méthode (ou les aliasKernel#format
dans le Powerpack Bibliothèque) est généralement préférée à laString#%
méthode, comme mentionné dans le Communauté Ruby Guide De Style.Bien sûr, cela est très discutable, mais pour donner un aperçu:
La syntaxe de @quackingduck la réponse serait
La nature de cette préférence est due principalement à la nature cryptique de
%
. Ce n'est pas très sémantique par lui-même et sans autre contexte, elle peut être confondue avec la%
opérateur modulo.Exemples de la Guide De Style:
À rendre la justice pour
String#%
, personnellement, j'aime vraiment l'aide de l'opérateur-comme syntaxes au lieu de commandes, de la même façon que vous feriezyour_array << 'foo'
suryour_array.push('123')
.Ce juste illustre une tendance dans la communauté, ce qui est "meilleur" est à vous.
Plus d'infos dans ce billet de blog.
De génération de nombre aléatoire
Utilisation Noyau#rand méthode:
Chaîne aléatoire de la génération
Utilisation
times
+map
+join
combinaison:Nombre de conversion de chaîne de caractères avec un rembourrage
Utilisation String#% méthode:
Génération de mot de passe
Utilisation KeePass password generator de la bibliothèque, il prend en charge différents modèles pour la génération aléatoire de mot de passe:
Une documentation pour KeePass modèles peuvent être trouvés ici.
Je veux juste modifier la première réponse.
rand (10**10)
peut générer à 9 chiffres aléatoires non si 0 est à la première place. Pour veiller à ce 10 le chiffre exact juste modifierfin
Ici est une expression qui va utiliser moins un appel de méthode que quackingduck l'exemple.
Une mise en garde,
1e10
est unFloat
, etKernel#rand
finit par appelerto_i
sur elle, donc, pour certaines valeurs supérieures vous pourriez avoir quelques incohérences. Pour être plus précis avec un littéral, vous pouvez aussi faire:Essayez d'utiliser le SecureRandom ruby bibliothèque.
Il génère des nombres aléatoires, mais la longueur n'est pas spécifique.
Passer par ce lien pour plus d'informations: http://ruby-doc.org/stdlib-2.1.2/libdoc/securerandom/rdoc/SecureRandom.html
10.times.map{ SecureRandom.random_number(9)}.join
10.times.map...
SecureRandom.random_number(10**10).to_s
Cette technique fonctionne pour n'importe quel "alphabet"
Façon la plus simple pour générer des n chiffres, de nombres aléatoires -
générer un numéro à 10 chiffres du numéro -
est plus rapide que
Vous pouvez utiliser:
et
dans la console Rails de le confirmer.
Une alternative la réponse, à l'aide de la
regexp-exemples
ruby gem:Il n'y a pas besoin de "pad avec des zéros" avec cette approche, puisque vous êtes immédiatement la génération d'un
String
.Juste une utilisation simple ci-dessous.
Il suffit de tester sur CISR ci-dessous.
Ça va marcher, même sur ruby 1.8.7:
Une meilleure approche est d'utiliser
Array.new()
au lieu de.times.map
. Rubocop le recommande.Exemple:
Rubucop, TimesMap:
https://www.rubydoc.info/gems/rubocop/RuboCop/Cop/Performance/TimesMap
Aléatoire de 10 numéros:
Dans mon cas, ce numéro doit être unique dans mes modèles, j'ai donc ajouté la vérification de bloc.
('%010d' % rand(0..9999999999)).to_s
ou
"#{'%010d' % rand(0..9999999999)}"
À la génération aléatoire, 10-chaîne de chiffres:
Voici plus en détail de ce qui se passe, illustré par la rupture de la ligne en plusieurs lignes expliquant les variables: