【问题标题】:Replace random elements of Array替换 Array 的随机元素
【发布时间】:2020-11-30 21:12:01
【问题描述】:

我有两个长度相同的数组

 import scala.util.Random
 val length = 10
 val x = 60 // Selection percentage
 val rnd = new Random
 var arrayOne =  Array.fill(length)(rnd .nextInt(100))
 arrayOne: Array[Int] = Array(8, 77, 11, 19, 17, 73, 5, 18, 45, 69)

 val arrayTwo =  Array.fill(length)(rnd .nextInt(100))
 arrayTwo: Array[Int] = Array(96, 21, 85, 70, 28, 5, 31, 56, 27, 76)

我可以从 arrayTwo 中选择前 x 个百分比的元素,这些选择的元素可以通过以下方式替换 arrayOne 的前 x 个百分比的元素。

arrayOne = arrayTwo.take((length * x / 100).toInt) ++ arrayOne.drop((length * x / 100).toInt)
arrayOne: Array[Int] = Array(96, 21, 85, 70, 28, 5, 5, 18, 45, 69)

现在我想从 arrayTwo 中选择随机 x 百分比的元素,并且选择的元素将替换 arrayOne 的随机 x 百分比元素。我该怎么做?

【问题讨论】:

    标签: arrays scala functional-programming scala-collections


    【解决方案1】:

    您可以通过Random.shuffle

    scala> val randSet = Random.shuffle(arrayOne.indices.toBuffer).take((arrayOne.length * x / 100).toInt).toSet
    randSet: scala.collection.immutable.Set[Int] = HashSet(0, 6, 9, 3, 8, 4)
    
    scala> val randMerged = arrayOne.indices.map(i => if(randSet(i)) arrayTwo(i) else arrayOne(i))
    randMerged: IndexedSeq[Int] = Vector(96, 77, 11, 70, 28, 73, 31, 18, 27, 76)
    

    randSet 将随机采用x 百分比索引。

    如果你不在乎数字的位置,有一个简单的:

    scala> val size = (arrayOne.length * x / 100).toInt
    size: Int = 6
    
    scala> Random.shuffle(arrayTwo).take(size) ++ Random.shuffle(arrayOne).drop(size)
    res11: scala.collection.mutable.ArraySeq[Int] = ArraySeq(76, 85, 28, 56, 21, 27, 69, 45, 17, 77)
    

    【讨论】:

    • 洗牌是昂贵的操作
    • @Asif 这是一个 O(n) 时间复杂度,在任何问题上都不能比 O(n) 做得更好。
    【解决方案2】:

    您可以以x的概率交换每件物品:

    val x = 60D
    val exchanged = arrayOne.indices
      .map(x => if(math.random > x / 100) arrayOne(x) else arrayTwo(x))
    

    但是这样你就不能保证(length * x / 100).toInt 元素来自arrayTwo。为了实现这一点,我会使用迭代/递归算法,我会选择随机索引,直到我有我想要的为止。

    【讨论】:

    • 您能分享一下您的迭代方法吗?
    • 我设置了x = 60,你的代码每次都返回arrayOne
    • @Asif 是的,因为您将其设为Int
    • @Asif 迭代方法在其他语言中很容易找到,在 Scala 中这不会有什么不同。这是一个例子:stackoverflow.com/questions/19269545/…
    猜你喜欢
    • 2019-01-09
    • 2015-11-24
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多