Estou tentando dividir uma matriz de nomes em várias matrizes em ordem aleatória cada vez que é executada. Eu sei como dividi-los com:
name_array = ["bob","john","rob","nate","nelly","michael"]
array = name_array.each_slice(2).to_a
=> [["bob", "john"], ["rob", "nate"], ["nelly", "michael"]]
Mas e se eu quiser cuspi-los em ordem aleatória a cada vez?
Respostas:
5 para resposta № 1Antes de fazer a mesma coisa, embaralhe a matriz. (Array#shuffle
)
name_array.shuffle.each_slice(2).to_a
# => [["nelly", "nate"], ["rob", "bob"], ["michael", "john"]]
ou embaralhe depois de acordo com sua necessidade:
name_array.each_slice(2).to_a.shuffle
# => [["nelly", "michael"], ["rob", "nate"], ["bob", "john"]]
3 para resposta № 2
Amostragem aleatória
Se você souber o tamanho da matriz original, então:
name_array.sample 6
Matriz # amostra reduz sua cadeia de métodos sobre o uso de Array # shuffle. Se você não deseja codificar o tamanho da amostra, pode introspectar o tamanho da matriz em tempo de execução. Por exemplo:
name_array.sample(name_array.size)
Permutação
Se você não precisar insistir em que um determinado nome apareça apenas uma vez no conjunto de resultados, considere também Matriz # permutação:
name_array.permutation(2).to_a.sample(name_array.size)
Os resultados variam, mas aqui está uma amostra bastante impressa dos resultados que você pode esperar dessa abordagem:
[["michael", "rob"],
["bob", "nelly"],
["rob", "bob"],
["michael", "nelly"],
["john", "michael"],
["john", "rob"]]
2 para resposta № 3
Embaralhe a matriz primeiro e depois corte:
["bob","john","rob","nate","nelly","michael"].shuffle.each_slice(2).to_a
#=> [["nelly", "nate"], ["rob", "michael"], ["john", "bob"]]
2 para resposta № 4
array = name_array.each_slice(2).to_a.shuffle
Isso fornecerá resultados diferentes sempre.