How to get a random element from a Set in Scala

2020-06-07 05:08发布

For any given set, for instance,

val fruits = Set("apple", "grape", "pear", "banana")

how to get a random element from fruits ?

Many Thanks.

8条回答
小情绪 Triste *
2楼-- · 2020-06-07 05:39

Not converting the Set to an ordered collection but using zipWithIndex we can attribute an index to each item in the collection,

fruits.zipWithIndex
Set((apple,0), (grape,1), (pear,2), (banana,3))

Thus for val rnd = util.Random.nextInt(fruits.size),

fruits.zipWithIndex.find( _._2 == rnd)
Option[(String, Int)] = Some((banana,3))

Given an empty set,

Set[String]().zipWithIndex.find( _._2 == 3)
Option[(String, Int)] = None
查看更多
女痞
3楼-- · 2020-06-07 05:40

Solution1

Random way ( import scala.util.Random )

scala>  fruits.toList(Random.nextInt(fruits.size))
res0: java.lang.String = banana

Solution2

Math way (no imports)

scala> fruits.toList((math.random*fruits.size).toInt)
res1: String = banana
查看更多
Root(大扎)
4楼-- · 2020-06-07 05:47

convert into Vector and get random element from it

scala> val fruits = Set("apple", "grape", "pear", "banana")
fruits: scala.collection.immutable.Set[String] = Set(apple, grape, pear, banana)

scala> import scala.util.Random
import scala.util.Random

scala> val rnd=new Random
rnd: scala.util.Random = scala.util.Random@31a9253

scala> fruits.toVector(rnd.nextInt(fruits.size))
res8: String = apple
查看更多
我想做一个坏孩纸
5楼-- · 2020-06-07 05:47

You can directly access an element of a Set with slice. I used this when I was working with a set that was changing in size, so converting it to a Vector every time seemed like overkill.

val roll = new Random ()

val n = roll nextInt (fruits size)
fruits slice (n, n + 1) last
查看更多
放我归山
6楼-- · 2020-06-07 05:47
   import Scala.util.Random

   val fruits = Set("apple", "grape", "pear", "banana").toVector

   val sz =fruits.size

   val num = Random.nextInt(sz)

   fruits(num)
查看更多
【Aperson】
7楼-- · 2020-06-07 05:53

If you don't mind an O(n) solution:

import util.Random

// val fruits = Set("apple", "grape", "pear", "banana")
Random.shuffle(fruits).head
// "pear"
查看更多
登录 后发表回答