我需要一个想法。我数学不好。也许它有内置的功能,我还没有找到。
我有一个包含2048个数据的数组。我需要从中获得250的价值。
我在想
2048/250 = 8.19
这意味着,我对数组中8个位置的每个增量取值。
有功能吗?
并不是我所知道的,我想的问题是要平衡迭代和采样的随机性。
所以天真的方法
dataSet.indexedMapNotNull { i, data ->
if (i % 8 == 0) data else null
}
这将遍历所有数组,因此您仅需要250次迭代,而不需要dataSet.size
迭代。那么,如果我们迭代250次又为每个迭代取第八次呢?
val sample = mutableListOf<DataType>()
for (i in 1..250) {
val positionInDataSet = (i * 8) - 1 //minus one adjust the index for the size
val case = dataSet[positionInDataSet]
sample.add(case)
}
另一种选择是仅使用集合中的复制方法,但是问题是您丢失了采样
dataSet.subArray(0, 250)
子阵列不会以伪随机方式对数据进行采样,而只会得到前250个,这会产生偏差。通常,数组复制方法的好处是对数N。
另一种选择是通过不获取数据(每个8)而不是随机位置(直到我们达到所需的样本大小)来进一步随机化事情。
val sample = mutableSetOf<DataType>()
while (sample.size != 250) {
val randomPosition = Random.nextInt(0, dataSet.size)
val randomSelection = dataSet[randomPosition]
sample.add(randomeSelection)
}
在这里我们使用一个集合,因为Set
保证了元素的唯一性,因此您从数据集中有完全随机的250个元素。这样做的问题是位置的随机性可能randomPosition
不止一次,因此您对数据集进行了250次以上的迭代,这甚至可能是阶乘,在较大的数据集中它将发生并且被认为是性能最低的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句