aboutsummaryrefslogtreecommitdiff
path: root/src/utils-common.ts
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fischer@muhq.space>2026-09-25 20:19:43 +0200
committerFlorian Fischer <florian.fischer@muhq.space>2026-09-25 21:00:13 +0200
commitbf09385a34f928e6c266d2f81337237955ee949b (patch)
tree4a400b2864d0887bc34e931ca3e87646276c9a4e /src/utils-common.ts
parent945f3bdceffed7d3bb20ee1849f5f166b3c467bc (diff)
downloadbycs-sol-bf09385a34f928e6c266d2f81337237955ee949b.tar.gz
bycs-sol-bf09385a34f928e6c266d2f81337237955ee949b.zip
mass-graduation: keep student selection stable for 45 minutes
Diffstat (limited to 'src/utils-common.ts')
-rw-r--r--src/utils-common.ts15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/utils-common.ts b/src/utils-common.ts
index 8053043..153bbaa 100644
--- a/src/utils-common.ts
+++ b/src/utils-common.ts
@@ -33,3 +33,18 @@ export async function getUserIconUrl(userId: number): Promise<string> {
return (userpicture as HTMLImageElement).src ?? "";
}
+
+// SplitMix32 implementation taken from:
+// https://github.com/bryc/code/blob/master/jshash/PRNGs.md
+// We only need a seeded PRNG to choose students to observe.
+export function splitmix32(a: number) {
+ return function () {
+ a |= 0;
+ a = (a + 0x9e3779b9) | 0;
+ let t = a ^ (a >>> 16);
+ t = Math.imul(t, 0x21f0aaad);
+ t = t ^ (t >>> 15);
+ t = Math.imul(t, 0x735a2d97);
+ return ((t = t ^ (t >>> 15)) >>> 0) / 4294967296;
+ };
+}