Knuth's algorithm S: Difference between revisions
→{{header|Kotlin}}: Minor improvements to existing class based solution. Added alternative function based solution.
m (replaced #2 with 2nd step.) |
(→{{header|Kotlin}}: Minor improvements to existing class based solution. Added alternative function based solution.) |
||
Line 939:
=={{header|Kotlin}}==
{{trans|Java}}
Class based solution:
<lang scala>// version
import java.util.Random
class SOfN<T>(val n: Int) {
Line 949 ⟶ 951:
private var i = 0
▲ val rand = Random()
}▼
fun process(item: T): ArrayList<T> {▼
if (++i <= n)
sample.add(item)
Line 961 ⟶ 959:
}
}
fun main(args: Array<String>) {
val bin = IntArray(10)
(1..100_000).forEach {
val sOfn = SOfN<Int>(3)
for (
for (s in sample!!) bin[s]++▼
}
println(bin.contentToString())
}</lang>
Sample output:
<pre>
[
</pre>
Alternative function based solution:
<lang scala>// version 1.2.51
import java.util.Random
val rand = Random()
fun <T> SOfNCreator(n: Int): (T) -> List<T> {
var i = 0
return {
if (++i <= n)
sample.add(it)
else if (rand.nextInt(i) < n)
sample[rand.nextInt(n)] = it
sample
▲ }
}
fun main(args: Array<String>) {
val bin = IntArray(10)
(1..100_000).forEach {
val sOfn = SOfNCreator<Int>(3)
for (d in 0..8) sOfn(d)
}
println(bin.contentToString())
}</lang>
Sample output:
<pre>
[30172, 29856, 30132, 29884, 29818, 30220, 29900, 30069, 29869, 30080]
</pre>
|