2011-08-17 5 views
3

Je cherche une méthode pour générer un code d'invitation. Je préférerais que le code ne ressemble pas à du texte tronqué: JakSj12Comment générer un mot aléatoire avec un nombre?

Mais plutôt plus comme heroku, en utilisant un mot amusant avec 3 chiffres.

lightspeed131 or happy124, jetski99 

Comment puis-je construire une méthode qui prend une liste de mots, peut-être 100? et leur attribue aléatoirement 3 numéros?

Merci

Répondre

3

Les autres réponses données ici sont un peu lentes, puisqu'elles trouver leurs listes à chaque appel. Voici quelque chose d'un peu plus vite:

def wordwithnumber(words) 
    words[rand(words.length)]+(rand(900)+100).to_s() 
end 

wordwithnumber(["lightspeed", "happy", "jetski"]) 

Cela vous donne trois chiffres à chaque fois, si vous voulez un nombre de 0 à 999 modifier le rand() appeler en conséquence.

+0

@AnApprentice, si c'est la réponse sélectionnée, alors vous vouliez seulement un mot, la question dit "assigne 3 numéros à eux ", je suppose que vous vouliez dire" à lui ". – tokland

+2

@rwat Notez qu'à partir de Ruby 1.9, vous pouvez utiliser 'words.sample' à la place de' words [rand (words.length)] '. – Phrogz

+0

@Phrogz Cool, c'est une fonction pratique que je ne connaissais pas :) – rwat

2
def random_name(words, number = nil) 
    number ||= rand(999) 

    words.sample.to_s + number.to_s # concatenate a random word and the number 
end 

# example: 
random_name(["lightspeed", "happy"]) # lightspeedXXX, happyXXX (where XXX is a random number) 
random_name(["lightspeed", "happy"], 5) # lightspeed5, happy5 
+2

Vous pouvez choisir 'rand (899) + 100' si vous voulez des numéros à trois chiffres garantis. – tadman

+0

@tadman Yep, +1. Cependant, dans l'exemple qu'il a fourni (heroku), il y a des nombres qui n'ont que deux chiffres, donc j'ai déduit qu'ils peuvent être n'importe quel nombre, pourvu qu'ils aient au maximum 3 chiffres. –

+1

si vous voulez 3 chiffres, vous pouvez aussi faire 'sprintf ("% s% 03d ", mots.sample.to_s, nombre)' –

2

Toujours 3 numéros différents? pas très efficace mais simple:

words.zip((100..999).to_a.shuffle).map(&:join) 

Si vous ne me dérange pas d'obtenir des chiffres répétés (je suppose que non):

words.map { |word| word + 3.times.map { rand(10) }.join } 

Ou tout simplement en Ruby 1.9:

words.map { |word| word + Random.new.rand(100..999).to_s } 

([ edit] Cela génère 100 mots avec des nombres, ce que j'ai compris.)

1

Je voudrais utiliser la solution suivante (à mon humble avis très lisible):

names = %w[tinky\ winky dipsy laa-laa po] 

def random_name(names) 
    [names, (100..999).to_a].collect(&:sample).join 
end 

3.times.collect { random_name(names) } 
# => ["dipsy147", "dipsy990", "po756"] 

solution plus conviviale mémoire:

def random_name(names) 
    @numbers ||= (100..999).to_a 
    [names, @numbers].collect(&:sample).join 
end 
+0

"En outre, le nom avec le numéro 100 sera toujours le premier nom dans le tableau." - Pouvez-vous expliquer s'il vous plaît? –

+0

Cette déclaration "Plus ..." de ma part était une erreur de ma part. J'ai mal lu votre code. J'ai supprimé mon commentaire et supprimé mon downvote (bien qu'il n'y ait toujours pas de bonne raison de créer un tableau de 900 éléments uniquement pour choisir une valeur au hasard). – Phrogz

+0

Cette dépendants de l'application/code. Dans une tâche rake ou autre travail d'arrière-plan, je ne vois pas de problème. Et vous pouvez même ajouter un cache pour les nombres. Éditera ma solution. –

1
def random_word_and_number(words, max=999) 
    "%s%0#{max.to_s.length}d" % [ words.sample, rand(max+1) ] 
end 

(1..4).map{ random_word_and_number(%w[ foo bar jim jam ]) } 
#=> ["jim048", "bar567", "jim252", "foo397"] 

Laissez vous spécifiez une valeur maximale arbitraire tout en veillant à ce que toutes les réponses ont le même nombre de chiffres.

Questions connexes