|
1 | 1 | package at.ac.uibk.dps.cirrina.execution.`object` |
2 | 2 |
|
3 | 3 | import java.lang.reflect.Array as ReflectArray |
| 4 | +import java.security.SecureRandom |
4 | 5 | import java.util.LinkedHashSet |
5 | 6 | import kotlin.random.Random |
6 | 7 | import org.apache.commons.jexl3.JexlArithmetic |
@@ -51,18 +52,38 @@ private object Provider { |
51 | 52 |
|
52 | 53 | class Stdlib { |
53 | 54 | companion object { |
54 | | - @Volatile private var rng: Random = Random.Default |
| 55 | + private val seedGenerator = SecureRandom() |
| 56 | + |
| 57 | + private val threadRng = |
| 58 | + object : ThreadLocal<Random>() { |
| 59 | + override fun initialValue(): Random { |
| 60 | + return Random(seedGenerator.nextLong()) |
| 61 | + } |
| 62 | + } |
55 | 63 |
|
56 | 64 | @JvmStatic |
57 | 65 | fun seed(seed: Long) { |
58 | | - rng = Random(seed) |
| 66 | + threadRng.set(Random(seed)) |
| 67 | + } |
| 68 | + |
| 69 | + @JvmStatic |
| 70 | + fun randomPayload(sizes: IntArray): ByteArray { |
| 71 | + val rng = threadRng.get() |
| 72 | + return ByteArray(sizes.random(rng)) |
59 | 73 | } |
60 | 74 |
|
61 | | - @JvmStatic fun randomPayload(sizes: IntArray) = ByteArray(sizes.random(rng)) |
| 75 | + @JvmStatic |
| 76 | + fun takeRandom(collection: Collection<*>): Any? { |
| 77 | + return collection.randomOrNull(threadRng.get()) |
| 78 | + } |
62 | 79 |
|
63 | | - @JvmStatic fun takeRandom(collection: Collection<*>): Any? = collection.randomOrNull(rng) |
| 80 | + @JvmStatic fun takeRandom(array: Array<Any>): Any? = array.randomOrNull(threadRng.get()) |
64 | 81 |
|
65 | | - @JvmStatic fun takeRandom(array: Array<Any>): Any? = array.randomOrNull(rng) |
| 82 | + @JvmStatic |
| 83 | + fun randomAround(base: Int, delta: Int): Int { |
| 84 | + val rng = threadRng.get() |
| 85 | + return (base - delta..base + delta).random(rng) |
| 86 | + } |
66 | 87 |
|
67 | 88 | @JvmStatic fun repeat(item: Boolean, n: Int) = BooleanArray(n) { item } |
68 | 89 |
|
|
0 commit comments