从Android Kotlin中的数组采样

卢卡·迪特里玛

我需要一个想法。我数学不好。也许它有内置的功能,我还没有找到。

我有一个包含2048个数据的数组。我需要从中获得250的价值。

我在想

2048/250 = 8.19

这意味着,我对数组中8个位置的每个增量取值。

有功能吗?

Cutiko

并不是我所知道的,我想的问题是要平衡迭代和采样的随机性。

所以天真的方法

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章