2012-02-01 21 views
45

Đây có thể là câu hỏi Scala ít quan trọng nhất từ ​​trước tới giờ, nhưng điều đó làm tôi phiền lòng. Làm thế nào tôi sẽ tạo ra một danh sách n số ngẫu nhiên. Những gì tôi có cho đến thời điểm này:Làm cách nào để tạo danh sách các số ngẫu nhiên?

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

Tác phẩm nào, nhưng không có vẻ gì là vô cùng đối với tôi. Tôi đang mở để gợi ý.

EDIT

Không phải vì nó có liên quan rất nhiều vì nó là thú vị và rõ ràng khi nhìn lại, cái nhìn sau như nó hoạt động:

1 to 20 map r.nextInt 

Nhưng chỉ số của mỗi mục trong danh sách quay trở lại là cũng là giới hạn trên của cái cuối cùng. Số đầu tiên phải nhỏ hơn 1, số thứ hai nhỏ hơn 2, v.v. Tôi chạy nó ba hay bốn lần và nhận thấy "Hmmm, kết quả luôn luôn bắt đầu với 0 ..."

+3

Điều đầu tiên bạn nên làm là tạo 'r' a' val' thay vì 'var'. – Jesper

+0

@ Jesper - cảm ơn. – Malvolio

+0

@Jesper - năm năm sau và cuối cùng tôi làm điều đầu tiên tôi nên làm ... – Malvolio

Trả lời

80

Bạn có thể sử dụng Don's solution hay:

Seq.fill(n)(Random.nextInt) 

Lưu ý rằng bạn không cần phải tạo đối tượng Random mới, bạn có thể sử dụng đối tượng mặc định đồng hành Ngẫu nhiên, như đã nêu ở trên.

+0

Tôi cần cung cấp giá trị tối đa cho hàm 'nextInt'. Đáng ngạc nhiên (với tôi ít nhất) điều này đã làm việc: 'Seq.fill (6) (Random.nextInt (100))' – Malvolio

+0

Nó không đáng ngạc nhiên, xem đối tượng đồng hành ngẫu nhiên: http://www.scala-lang.org/api /current/index.html#scala.util.Random – Nicolas

+0

Ý tôi là, tôi đã ngạc nhiên khi thấy rằng 'Random.nextInt (100)' được hiểu là * chức năng ẩn danh * Tôi muốn nó trở thành và không phải là giá trị int Tôi nghĩ nó trông như thế này. – Malvolio

29

Làm thế nào về:

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

Có thể điều này hiển nhiên đối với mọi người nhưng tôi cần phải làm 'val r = new util.Random; Stream.continually (r.nextInt) .take (10) 'để lấy mã hoạt động. – pr1001

+0

Tôi đã viết nó thành 'Stream.continually (r.nextInt (100)). (10) .toList' -' .toList' có thể không cần thiết nhưng 'r.' thì không. – Malvolio

+0

Xin lỗi vì sự nhầm lẫn, tôi đã nhập util.Random.nextInt như @Nicholas đoán. Đối với một tiện ích nhiều hơn một chút, bạn có thể làm cho một val ra khỏi Stream.continually (nextInt (100)). –

4

về EDIT bạn,

nextInt có thể mất một cuộc tranh cãi Int như một giới hạn trên cho số ngẫu nhiên, do 1 to 20 map r.nextInt cũng giống như 1 to 20 map (i => r.nextInt(i)), chứ không phải là một lỗi biên dịch hữu ích hơn.

1 to 20 map (_ => r.nextInt(100)) thực hiện những gì bạn dự định. Nhưng tốt hơn nên sử dụng Seq.fill vì điều đó thể hiện chính xác hơn những gì bạn đang làm.

Các vấn đề liên quan