Random 使用kotlin streams从列表中获取随机项
如何以简单简洁的方式从列表中获取随机项。Random 使用kotlin streams从列表中获取随机项,random,kotlin,Random,Kotlin,如何以简单简洁的方式从列表中获取随机项。 如果我想从这个列表中得到一个偶数随机数 val list = listOf(1, 2, 3, 4, 5, 6, 7, 9).filter { it % 2 == 0 } 注: 我知道java中有一些类似的答案可以解决这个问题,但我认为我们可以在kotlin中找到一种更简洁的方法。我认为最简单、最简洁的方法是创建一个返回随机元素的扩展函数,以便可以这样使用: val random = list.random() 扩展功能: /** * Returns
如果我想从这个列表中得到一个偶数随机数
val list = listOf(1, 2, 3, 4, 5, 6, 7, 9).filter { it % 2 == 0 }
注:我知道java中有一些类似的答案可以解决这个问题,但我认为我们可以在kotlin中找到一种更简洁的方法。我认为最简单、最简洁的方法是创建一个返回随机元素的扩展函数,以便可以这样使用:
val random = list.random()
扩展功能:
/**
* Returns a random element.
*/
fun <E> List<E>.random(): E? = if (size > 0) get(Random().nextInt(size)) else null
/**
*返回一个随机元素。
*/
乐趣列表。随机():E?=if(size>0)get(Random().nextInt(size))else null
感谢@Francesco comment,这里有另一个函数,它将随机实例作为随机性的来源
/**
* Returns a random element using the specified [random] instance as the source of randomness.
*/
fun <E> List<E>.random(random: java.util.Random): E? = if (size > 0) get(random.nextInt(size)) else null
/**
*使用指定的[random]实例作为随机性源返回随机元素。
*/
乐趣列表.random(random:java.util.random):E?=if(size>0)get(random.nextInt(size))else null
Kotlin 1.3及以上版本:
Kotlin 1.3现在可用于多平台随机数生成器强>
您可以这样使用它:
import kotlin.random.Random
fun main() {
println(Random.nextBoolean())
println(Random.nextInt())
}
还是你的情况
fun main() {
val list = (1..9).filter { it % 2 == 0 }
println(list.random())
}
科特林1.2 自从Kotlin 1.2以来,我们已经。此方法可以帮助您使用提取所需元素的数量(本例中仅一个) 与1.2版之前的方法相比,该方法的优化程度较低,但它适用于多平台上下文。根据你的上下文使用你需要的
在Kotlin 1.2之前 在Kotlin 1.2之前,在多平台上下文中不存在生成随机数的解决方案。最简单的解决方案是直接调用平台Random 虚拟机 在JVM上,我们使用
Random
甚至ThreadLocalRandom
,如果我们使用的是JDK>1.6
import java.util.Random
fun IntRange.random() = Random().nextInt((endInclusive + 1) - start) + start
JS
在JS上,我们使用Math.Random
fun IntRange.random() = (Math.random() * ((endInclusive + 1) - start) + start).toInt()
仅仅为了得到一个随机数而洗牌整个列表是对性能的浪费 改为使用Kotin 1.3中介绍的
val randomNumber = listOf(1, 6, 8).random()
对于您的特殊用例,首先筛选列表并从剩余项中选择一个随机数是有意义的
val randomEvenNumber = listOf(1, 2, 3, 4, 5, 6, 7, 9).filter { it % 2 == 0 }.random()
如果要从列表中选择25个随机元素,我会这样做:
var suliTraffic = ArrayList<SuliTraffic>()
var randomsuliTraffic = ArrayList<SuliTraffic>()
// I have add some data to my Array List
randomsuliTraffic.add(new)
// Here i shuffle all the information i have wich is over 400 object
randomsuliTraffic.shuffle()
// now you can just simply get 25 item from this randomsuliTraffic like this
for (i in randomsuliTraffic.take(25)){
suliTraffic.add(i)
}
var suliTraffic=ArrayList()
var randomsuliTraffic=ArrayList()
//我已经在数组列表中添加了一些数据
randomsuliTraffic.add(新)
//在这里,我洗牌的所有信息,我有超过400个对象
randomsuliTraffic.shuffle()
//现在你只需从这个随机的Sulitraffic中得到25件物品,就像这样
对于(我在随机的sulitraffic.take(25)){
补充(i)
}
现在,您可以在
suliTraffic
列表中找到25个随机元素。正如其他人所说,list.random()
现在应该可以解决这个问题,但是如果您不知道列表是否为空,.random()
可能会引发异常。除了将.randomOrNull()
实现为扩展函数之外,您还可以使用list.shuffled().firstOrNull()
对其进行破解,但要注意,这对于长列表来说很慢
.randomOrNull()
方法:
fun <E> List<E>.randomOrNull(): E? = if (size > 0) random() else null
fun List.randomOrNull():E?=如果(大小>0)随机()否则为空
每次都要小心使用新初始化的随机实例。通常随机性需要几次调用才能调整到可接受的阈值。有趣的是,我可以想到这种方法的一种变体,它采用预先指定的随机性。我会加上它。感谢您的注意。Random()
的当前实现是:public Random(){this(seeduniquifer()^System.nanoTime());}
@FrancescoMenzani,您对新初始化的实例有什么担心?我更关心的是每次调用时的对象创建。另外,我建议将一个存储实例设置为私有,这样它只能在声明它的文件中访问。我使用了这种方法,但我需要对整个列表进行洗牌,这在外部效率很低。当您只想得到一个随机元素时,shuffled的实现会遍历所有列表项。Kotlin js或Kotlin native上不提供如何更灵活地处理多平台context.java.util.Random。如果您不想重新实现自己的随机数生成器,那么这是唯一可能的方法。如果您需要从列表中随机选取3个值,则shuffled().take()可以,而不是您的方法(但这不是您的用例)。为什么不选择“list.shuffled()[0]”,因为使用take可以提取1个或多个值。如果您只需要一个值,那么您的解决方案是相同的。
fun <E> List<E>.randomOrNull(): E? = if (size > 0) random() else null