2012-02-01 33 views
45

To może być najmniej ważne pytanie na temat Scali, ale mnie to dręczy. Jak wygenerować listę n liczby losowej. Co mam do tej pory:Jak wygenerować listę liczb losowych?

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

Która działa, ale nie wygląda zbyt skalisto. Jestem otwarty na sugestie.

EDIT

Nie dlatego, że jest to istotne, tak samo jak to jest zabawne i oczywiste z perspektywy czasu, następujące wygląda jak to działa:

1 to 20 map r.nextInt 

Ale indeks każdego wpisu w zwracanej listy jest także górna granica tego ostatniego. Pierwsza liczba musi być mniejsza niż 1, druga mniejsza niż 2 i tak dalej. Pobiegłem on trzy lub cztery razy i zauważyłem "Hmmm, wynik zawsze zaczyna się od 0 ..."

+3

Pierwszą rzeczą, którą powinieneś zrobić, jest uczynienie 'r'' 'val' zamiast' var'. – Jesper

+0

@Jesper - dzięki. – Malvolio

+0

@Jesper - pięć lat później iw końcu robię pierwszą rzecz, którą powinienem zrobić ... – Malvolio

Odpowiedz

80

Można użyć Don's solution czyli

Seq.fill(n)(Random.nextInt) 

Zauważ, że nie musisz tworzyć nowego obiektu Random, możesz użyć domyślnego obiektu towarzyszącego Losowe, jak podano powyżej.

+0

Potrzebowałem podać maks. Dla funkcji 'nextInt'. Co zaskakujące (przynajmniej dla mnie) zadziałało to: 'Seq.fill (6) (Random.nextInt (100))' – Malvolio

+0

Nic dziwnego, zobacz obiekt Losowy towarzysz: http://www.scala-lang.org/api /current/index.html#scala.util.Random – Nicolas

+0

Miałem na myśli, byłem zaskoczony, że to "Random.nextInt (100)" zostało zinterpretowane jako * anonimowa funkcja * Chciałem, żeby to było, a nie wyrażone int Myślałem, że to wygląda. – Malvolio

29

Jak o:

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

Może to jest oczywiste dla wszystkich innych, ale musiałem zrobić 'val r = new util.Random; Stream.continually (r.nextInt) .take (10) ', aby kod zadziałał. – pr1001

+0

Napisałem go jako 'Stream.continually (r.nextInt (100)). Take (10) .toList' -' 'toList' może być niepotrzebny, ale' r' nie jest. – Malvolio

+0

Przepraszam za zamieszanie, zaimportowałem util.Random.nextInt jak się domyślał @Nicholas. Aby uzyskać nieco większą użyteczność, możesz zrobić val ze Stream.continually (nextInt (100)). –

4

dotyczące swojej edycji,

nextInt mogą brać Int argumentu jako górna granica dla liczby losowej, więc 1 to 20 map r.nextInt jest taka sama jak 1 to 20 map (i => r.nextInt(i)), zamiast bardziej użytecznego błędem kompilacji.

1 to 20 map (_ => r.nextInt(100)) wykonuje to, co zamierzałeś. Ale lepiej jest używać Seq.fill, ponieważ dokładniej oznacza to, co robisz.

Powiązane problemy