Scala 生成一个集合,新添加的元素依赖于已添加的元素

Scala 生成一个集合,新添加的元素依赖于已添加的元素,scala,Scala,我想从输入集合中创建一组随机选择的索引观测值: case class Observation(id: Long, metric1: Double) val observations: Seq[Observation] val NumSamples = 100 val indices = // A set of randomly selected indices of the observations // WITHOUT replacement 复杂的是,为了避

我想从输入集合中创建一组随机选择的索引
观测值

case class Observation(id: Long, metric1: Double)

val observations: Seq[Observation]

val NumSamples = 100
val indices = // A set of randomly selected indices of the observations
              // WITHOUT replacement
复杂的是,为了避免在选择新索引时替换现有索引(通过
myRandom.nextInt(observations.length
),我们需要访问先前的索引-这在序列的初始生成过程中是不可能的

这里显示了我要查找的内容的概要

最受欢迎(但我怀疑能否做到)


val-sampledIndices:Seq[Int]=for(randInd我想这正是你想要的

val sampledIndices: Seq[Int] = scala.util.Random.shuffle((0 until observations.size))

另一个选项是使用展开函数,该函数通过创建值和状态来创建流,以在每个步骤中获取下一个值

def unfold[A,S](z: S)(implicit f: S => Option[(A,S)]): Stream[A] = {
  f(z) match{
    case None => Stream[A]()
    case Some((value, state)) => value#::unfold(state)
  }
}
然后创建您的列表:

unfold(Random)((a => Some(a.nextInt, a))).take(NSamples).toList

为什么
f
是隐式的?为了避免在递归调用中再次发送它:case Some((值,状态))=>value#:::展开(状态)(f)真的吗_(ツ)_/''我刚刚注意到
::unfold
。这对我来说是全新的,我要去谷歌看看。你能解释一下这是如何避免重复索引的吗?这非常适合特定的用例;)-因此,向上投票。我希望得到更多:这类问题的一般解决方案-这让我不时感到困扰。请参阅Thx以获取链接:我应该使用
knuth shuffle
算法
def unfold[A,S](z: S)(implicit f: S => Option[(A,S)]): Stream[A] = {
  f(z) match{
    case None => Stream[A]()
    case Some((value, state)) => value#::unfold(state)
  }
}
unfold(Random)((a => Some(a.nextInt, a))).take(NSamples).toList