问题描述
我有两个相同长度的数组
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)