替换数组的随机元素

问题描述

我有两个相同长度的数组

 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,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,69)

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

解决方法

您可以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。为了实现这一点,我将采用迭代/递归算法,在该算法中,我会选择随机索引,直到拥有所需数量为止。

,

您可以通过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,56,21,69,45,17,77)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...