Skip to content

Commit 65cafb0

Browse files
authored
feat: adding std library function to return random value for a number… (#125)
1 parent 1f168fd commit 65cafb0

1 file changed

Lines changed: 26 additions & 5 deletions

File tree

  • src/main/kotlin/at/ac/uibk/dps/cirrina/execution/object

src/main/kotlin/at/ac/uibk/dps/cirrina/execution/object/Expression.kt

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package at.ac.uibk.dps.cirrina.execution.`object`
22

33
import java.lang.reflect.Array as ReflectArray
4+
import java.security.SecureRandom
45
import java.util.LinkedHashSet
56
import kotlin.random.Random
67
import org.apache.commons.jexl3.JexlArithmetic
@@ -51,18 +52,38 @@ private object Provider {
5152

5253
class Stdlib {
5354
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+
}
5563

5664
@JvmStatic
5765
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))
5973
}
6074

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+
}
6279

63-
@JvmStatic fun takeRandom(collection: Collection<*>): Any? = collection.randomOrNull(rng)
80+
@JvmStatic fun takeRandom(array: Array<Any>): Any? = array.randomOrNull(threadRng.get())
6481

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+
}
6687

6788
@JvmStatic fun repeat(item: Boolean, n: Int) = BooleanArray(n) { item }
6889

0 commit comments

Comments
 (0)