2012-02-01 27 views
45

Esta podría ser la pregunta de Scala menos importante, pero me está molestando. ¿Cómo generaría una lista de n número aleatorio? Lo que tengo hasta ahora:¿Cómo generar una lista de números aleatorios?

def n_rands(n : Int) = { 
val r = new scala.util.Random 
1 to n map { _ => r.nextInt(100) } 
} 

Lo que funciona, pero no se ve muy Scalarific para mí. Estoy abierto a sugerencias.

EDITAR

No

porque es relevante tanto, ya que es divertida y obvio en retrospectiva, los siguientes parece que funciona:

1 to 20 map r.nextInt 

embargo, el índice de cada entrada en la lista devuelta es también el límite superior de ese último. El primer número debe ser menor que 1, el segundo menor que 2, y así sucesivamente. Lo pasé tres o cuatro veces y se dio cuenta "Hmmm, el resultado siempre comienza con 0 ..."

+3

Lo primero que debe hacer es hacer 'r' a' val' en lugar de 'var'. – Jesper

+0

@Jesper - gracias. – Malvolio

+0

@Jesper - cinco años después y finalmente hago lo primero que debo hacer ... – Malvolio

Respuesta

80

Puede utilizar Don's solution o:

Seq.fill(n)(Random.nextInt) 

Tenga en cuenta que no necesita crear un nuevo objeto Random, puede usar el objeto complementario predeterminado Random, como se indicó anteriormente.

+0

Necesitaba proporcionar un máximo para la función 'nextInt'. Sorprendentemente (al menos para mí) funcionó: 'Seq.fill (6) (Random.nextInt (100))' – Malvolio

+0

No es sorprendente, vea el objeto complementario Random: http://www.scala-lang.org/api /current/index.html#scala.util.Random – Nicolas

+0

Quise decir, me sorprendió que 'Random.nextInt (100)' se interpretara como la * función anónima * que yo quería que fuera y no el valor int expresado Pensé que parecía. – Malvolio

29

¿Qué tal:

import util.Random.nextInt 
Stream.continually(nextInt(100)).take(10) 
+3

Quizás esto sea obvio para todos los demás, pero tenía que hacer 'val r = new util.Random; Stream.continually (r.nextInt) .take (10) 'para que el código funcione. – pr1001

+0

Lo escribí como 'Stream.continually (r.nextInt (100)). Take (10) .toList' - el' .toList' puede ser innecesario pero el 'r' no lo es. – Malvolio

+0

Disculpe la confusión, importé util.Random.nextInt como @Nicholas supuso. Para un poco más de utilidad, podría hacer un val de Stream.continually (nextInt (100)). –

4

con respecto a su edición,

nextInt puede tomar un argumento Int como un límite superior para el número al azar, por lo 1 to 20 map r.nextInt es lo mismo que 1 to 20 map (i => r.nextInt(i)), en lugar de un error de compilación más útil.

1 to 20 map (_ => r.nextInt(100)) hace lo que pretendía. Pero es mejor usar Seq.fill, ya que representa con mayor precisión lo que está haciendo.

Cuestiones relacionadas