Разница в распределении между Kotlin Random и Java Random - PullRequest
1 голос
/ 05 февраля 2020

Учитывая следующий код:

import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.newFixedThreadPoolContext
import kotlinx.coroutines.runBlocking
import java.util.concurrent.ConcurrentSkipListSet
import java.util.Random

val ids = ConcurrentSkipListSet<String>()

fun append(id: String) {
    if (ids.contains(id)) throw RuntimeException("Repeated: $id")
    ids.add(id)
}

fun main() = runBlocking<Unit> {
    val rnd = Random(System.nanoTime())
    delay(1000)

    val scope = CoroutineScope(newFixedThreadPoolContext(32, "MyThread"))
    repeat(10_000_000) {
        scope.launch {
            val high = rnd.nextLong()
            val low = rnd.nextLong()

            append("$high:$low")
        }
    }

    scope.coroutineContext[Job]?.children?.forEach { it.join() }
}

Работая на MacOS 10.14.6, Kotlin 1.3 и JVM 1.8, я не смог произвести повторный идентификатор. Тем не менее, после замены import java.util.Random на import kotlin.random.Random я могу создать повторный идентификатор почти сразу (после генерации 25000). Ожидается ли это что-то в отношении алгоритма XorWow?

1 Ответ

1 голос
/ 14 февраля 2020

Это было тонко. с kotlin 1.3, фабричная функция Random(seed) возвращает реализацию XorWow, которая не совпадает с реализацией Java. Эта реализация НЕ является поточно-ориентированной. Поэтому не используйте один экземпляр XorWowRandom, совместно используемый несколькими потоками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...