Cómo generar una lista de números aleatorios?

Este podría ser el menos importante de la Scala se pregunta alguna vez, pero es que me molesta. ¿Cómo puedo generar una lista de n números aleatorios. Lo que tengo hasta ahora:

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

Que funciona, pero no se ve muy Scalarific a mí. Estoy abierto a sugerencias.

EDITAR

No porque sea relevante, tanto como una forma divertida y obvio en retrospectiva, la siguiente se ve como funciona:

1 to 20 map r.nextInt

Pero el índice de cada entrada en la lista devuelta es también el límite superior de la última. El primer número debe ser menor que 1, la segunda en menos de 2, y así sucesivamente. Pasé tres o cuatro veces y notó «Hmmm, el resultado siempre se comienza con 0…»

  • cinco años más tarde y que finalmente lo primero que debo hacer…
InformationsquelleAutor Malvolio | 2012-02-01

3 Kommentare

  1. 92

    Puede utilizar No de la solución o:

    Seq.fill(n)(Random.nextInt)

    Tenga en cuenta que usted no necesita crear un nuevo Random objeto, puede utilizar el valor predeterminado compañero de objetos al Azar, como se indicó anteriormente.

    • Yo necesarios para el suministro de un máximo para el nextInt función. Sorprendentemente (al menos para mí) esto funcionó: Seq.fill(6)(Random.nextInt(100))
    • No es de extrañar, consulte el Azar objeto acompañante: scala-lang.org/api/current/index.html#scala.util.Random
    • Quiero decir, me sorprendió que lo que Random.nextInt(100) fue interpretado como la función anónima que yo quería ser y no la int valores expresados pensé que parecía.
    • Es debido a que el segundo parámetro de la función de llenado se pasa «por el nombre» (es tipo es => E): Random.nextInt(100)se evalúa para cada valor creado.
    • Seq.fill(5)(util.Random.nextInt)
  2. 35

    Cómo sobre:

    import util.Random.nextInt
    Stream.continually(nextInt(100)).take(10)
    • Tal vez esto es obvio para todos los demás, pero necesitaba hacer val r = new util.Random; Stream.continually(r.nextInt).take(10) para obtener el código de trabajo.
    • Lo escribí como Stream.continually(r.nextInt(100)).take(10).toList — el .toList puede ser innecesario, pero la r. no lo es.
    • Lo siento por la confusión, me había importado util.Azar.nextInt como @Nicolás adivinado. Para un poco más de utilidad que podría hacer un val de Corriente.continuamente(nextInt(100)).
    • Esto fue muy útil para mí porque podría filtrar a través de un Arroyo.distintas antes de tomar(n) para obtener un único muestreo, que era lo que yo necesitaba.
  3. 5

    con respecto a su EDICIÓN,

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

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

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea