回答
生成之間from
(含)to
(不含)的隨機整數
import java.util.Random
val random = Random()
fun rand(from: Int, to: Int) : Int {
return random.nextInt(to - from) + from
}
首先,您需要一個RNG。在Kotlin中,您目前需要使用平臺特定的平臺(沒有內置Kotlin)。對於JVM,它是java.util.Random
。您需要創建一個實例,然後致電random.nextInt(n)
。
有做這個的標準方法,但你可以很容易地使用任何Math.random()
或類java.util.Random
創建你自己的。下面是使用Math.random()
方法的示例:
fun random(n: Int) = (Math.random() * n).toInt()
fun random(from: Int, to: Int) = (Math.random() * (to - from) + from).toInt()
fun random(pair: Pair<Int, Int>) = random(pair.first, pair.second)
fun main(args: Array<String>) {
val n = 10
val rand1 = random(n)
val rand2 = random(5, n)
val rand3 = random(5 to n)
println(List(10) { random(n) })
println(List(10) { random(5 to n) })
}
這是一個示例輸出:
[9, 8, 1, 7, 5, 6, 9, 8, 1, 9]
[5, 8, 9, 7, 6, 6, 8, 6, 7, 9]
我建議使用上ClosedRange以下extension功能:
fun ClosedRange<Int>.random() =
Random().nextInt(endInclusive - start) + start
並使用它像這樣:
// will return an `Int` between 0 and 9 (incl.)
(0..10).random()
如果您正在使用JDK> = 1.7,請使用ThreadLocalRandom.current()
而不是Random()
。
另請參閱此answer以瞭解我的建議的變體。它還包括隨機Char
s的擴展功能。
您可以創建一個extension function類似java.util.Random.nextInt(int)
而是一個對於其綁定需要一個IntRange
而不是Int
的:
fun Random.nextInt(range: IntRange): Int {
return range.start + nextInt(range.last - range.start)
}
現在,您可以用任何Random
情況下使用:
val random = Random()
println(random.nextInt(5..9)) // prints 5, 6, 7, or 8
如果您不想管理自己的Random
實例,則可以使用例如ThreadLocalRandom.current()
定義便利方法:
fun rand(range: IntRange): Int {
return ThreadLocalRandom.current().nextInt(range)
}
現在,你可以得到一個隨機整數,你在Ruby中會,而不必首先聲明自己一個Random
實例:
rand(5..9) // returns 5, 6, 7, or 8
大廈關閉@s1m0nw1優秀的答案我做了如下修改。
- (0 ..N)在科特林意味着包容
- (0到N)在科特林意味着獨家
- 使用的隨機比如一個單獨的對象(可選)
代碼:
private object RandomRangeSingleton : Random()
fun ClosedRange<Int>.random() = RandomRangeSingleton.nextInt((endInclusive + 1) - start) + start
測試案例:
fun testRandom() {
Assert.assertTrue(
(0..1000).all {
(0..5).contains((0..5).random())
}
)
Assert.assertTrue(
(0..1000).all {
(0..4).contains((0 until 5).random())
}
)
Assert.assertFalse(
(0..1000).all {
(0..4).contains((0..5).random())
}
)
}
可能的變化我的回答above
a)如果你想0..10.random()
也包括價值10
,以下變化是必要的:
fun ClosedRange<Int>.random() =
Random().nextInt(endInclusive + 1 - start) + start
b)爲了獲得隨機Char
S,你可以像這樣定義一個擴展功能
fun ClosedRange<Char>.random(): Char =
(Random().nextInt(endInclusive.toInt() + 1 - start.toInt()) + start.toInt()).toChar()
// will return a `Char` between A and Z (incl.)
('A'..'Z').random()
如果你使用JDK> = 1.7下工作,使用ThreadLocalRandom.current()
代替Random()
。
使用頂級功能,可以實現完全相同的調用語法在紅寶石(如你所願):
fun rand(s: Int, e: Int) = Random().nextInt(e + 1 - s) + s
用法:
rand(1, 3) // returns either 1, 2 or 3
如果數字要選擇不連續,可以在列表中定義自己的擴展功能:
fun List<*>.randomElement()
= if (this.isEmpty()) null else this[Random().nextInt(this.size)]
用法:
val list = listOf(3, 1, 4, 5)
val number = list.randomElement()
返回列表中的一個數字。
Kotlin標準庫不提供隨機數生成器API。如果您不在多平臺項目中,最好使用平臺api (關於此解決方案的所有其他問題的答案)。
但是,如果您處於多平臺環境中,最好的解決方案是在純kotlin中自己實現隨機,以便在平臺之間共享相同的隨機數生成器。開發和測試更簡單。
要回答我個人項目中的這個問題,我實現了一個純Kotlin Linear Congruential Generator。 LCG是由java.util.Random
使用的算法。如果你想使用它,請點擊此鏈接: https://gist.github.com/11e5ddb567786af0ed1ae4d7f57441d4
我的實施目的nextInt(range: IntRange)
爲你;)。
注意我的目的,LCG適用於大多數使用案例(模擬,遊戲等)但由於此方法的可預測性而不適合加密使用。
由於科特林1.2的,你可以寫:
(1..3).shuffled().last()
要知道它的大O(n)的,但對於一個小清單(尤其是唯一值)這是正常的:d
- 1. 如何在VB6中獲得一個隨機字母?
- 2. 在隨機數字列表中獲得第一個素數
- 3. 如何獲得隨機數
- 4. 如何在Freemarker模板中獲得一個隨機整數?
- 5. 我如何獲得一個隨機數字以保持光滑?
- 6. 如何獲得一個不在整數黑名單中的隨機數字?
- 7. 如何從一系列數字中獲得隨機值?
- 8. 如何在數組中獲得不同的隨機數字?
- 9. 如何從列表中獲得兩個隨機數字?
- 10. 如何從我的數據庫中獲得一個隨機rowId?
- 11. 如何從非連續集合中獲得一個隨機數?
- 12. 如何從php數組中獲得一個隨機列表值
- 13. 如何從飛鏢的射程中獲得一個隨機數?
- 14. 如何從大氣噪聲中獲得一個隨機數?
- 15. 如何在特殊部分獲得一個隨機數
- 16. 如何在ruby1.9.3中獲得真正的隨機數字?
- 17. 如何在JSTL中獲得隨機數字?
- 18. 如何獲得一個隨機數來倒數
- 19. 如何在MatLab中獲得一個隨機向量?
- 20. 如何在CakePHP 3.0中獲得一個隨機行?
- 21. 如何生成一個隨機數字以獲得數組中的隨機對象
- 22. 無法從隨機類中獲得一個隨機的int值
- 23. Android如何獲得隨機sqlite數據?
- 24. 如何獲得真正的隨機數?
- 25. 如何做一個隨機數字?
- 26. 在MS Visual Basic 2008中獲得一個隨機數
- 27. 在Java中獲得隨機數
- 28. 生成一個隨機數得到一個隨機列表項
- 29. 如何從ping中獲得一個隨機生成的ip
- 30. 如何獲得一個隨機像素在C#
如果你想獲得一些隨機的'Int's,你可以使用[Random#int(size,from,to)](http://docs.oracle.com/javase/8/docs/api/java /util/Random.html#ints-long-int-int-)代替[tag:java-8]。 –
此解決方案不適用於Javascript/Native Kotlin。也許讓一個更通用的方法來做到這一點可能會很酷。 :) –