如何从Scala中的数组中选择一个随机元素?

sam*_*sam 49 scala scala-2.8

例如,有一个Scala数组val A = Array("please", "help", "me").如何从这个数组中选择一个随机元素?

use*_*062 92

import scala.util.Random

val A = Array("please", "help", "me")
Random.shuffle(A.toList).head
Run Code Online (Sandbox Code Playgroud)

  • 没有什么比临时解决方案更永久;) (36认同)
  • 重新排序整个列表并选择头部比仅仅选择O(1)数组的值更有效吗? (21认同)
  • 应该是`headOption`,因为`seq`(这里的'Array`)可能是空的. (8认同)
  • http://c2.com/cgi/wiki?PrematureOptimization这个问题没有说明任何效率需求,实际上给出了一个非常短的数组的例子:) (4认同)
  • 为什么要暂时的?它工作正常,并且不太容易在数组边界中出现任何编码错误. (4认同)
  • A不是空的.它包含三个字符串. (4认同)

小智 38

import scala.util.Random

val A = List(1, 2, 3, 4, 5, 6)
A(Random.nextInt(A.size))
Run Code Online (Sandbox Code Playgroud)

  • 如果`A.size`等于零,这将崩溃.永远不要忘记边缘情况 (16认同)
  • 哦,你可以使用`A.lift(Random.nextInt(A.size))`这将给你`Option [Int] (5认同)

top*_*ess 37

import java.util.Random
// ...
val rand = new Random(System.currentTimeMillis())
val random_index = rand.nextInt(A.length)
val result = A(random_index)
Run Code Online (Sandbox Code Playgroud)

  • 虽然这里的目的是不安全的伪随机性,但是除非你真的知道你在做什么,否则自我种子RNG是不好的做法.设置为当前时间特别糟糕,因为它显着缩小了可能种子的窗口.有关详细信息,请参阅此系列:http://jazzy.id.au/default/2010/09/20/cracking_random_number_generators_part_1.html (29认同)
  • 如果`A.length`等于零,这将崩溃.永远不要忘记边缘情况 (11认同)
  • 或者`scala.util.Random` (7认同)