function vrf() {
return Math.random();
}
const blockCount = 1000000;
const pools = [10, 20, 30, 40, 10, 15, 20];
const total = pools.reduce((a, n) => a + n, 0);
const average_slots_between_blocks = 20;
console.log("VRF w/frequency: ")
let pool_count = [ 0, 0, 0, 0, 0, 0, 0];
let num_battles = 0;
let prev = 0;
let total_gap = 0;
let sum_gap_sq = 0;
let gap_count = 0;
for (let i = 0; i < blockCount; i++) {
for (let j = 0; j < pools.length; j++) {
if (vrf() < (1 / average_slots_between_blocks) * pools[j] / total) {
pool_count[j] += 1;
// console.log("pool", j, "produced a block at slot", i, "(gap:", i - prev, ")")
if (prev !== i) {
gap_count += 1;
total_gap += i - prev;
sum_gap_sq += (i - prev) * (i - prev);
prev = i;
} else {
num_battles += 1;
}
}
}
}
let avg = total_gap / gap_count;
console.log("Average gap: ", total_gap / gap_count);
console.log("Gap variance:", sum_gap_sq / gap_count - (avg * avg));
let pool_total = pool_count.reduce((t, n) => t + n, 0);
console.log("Average count: ", pool_total / pool_count.length);
console.log("Battle Frequency: ", num_battles / gap_count);
console.log("VRF w/o frequency:")
pool_count = [ 0, 0, 0, 0, 0, 0, 0];
num_battles = 0;
prev = 0;
total_gap = 0;
sum_gap_sq = 0;
gap_count = 0;
for (let i = 0; i < blockCount; i++) {
if (i % average_slots_between_blocks !== 0) {
continue;
}
for (let j = 0; j < pools.length; j++) {
if (vrf() < pools[j] / total) {
pool_count[j] += 1;
// console.log("pool", j, "produced a block at slot", i, "(gap:", i - prev, ")")
if (prev != i) {
gap_count += 1;
total_gap += i - prev;
sum_gap_sq += (i - prev) * (i - prev);
prev = i;
} else {
num_battles += 1;
}
}
}
}
avg = total_gap / gap_count;
console.log("Average gap: ", total_gap / gap_count);
console.log("Gap variance:", sum_gap_sq / gap_count - (avg * avg));
pool_total = pool_count.reduce((t, n) => t + n, 0);
console.log("Average count: ", pool_total / pool_count.length);
console.log("Battle Frequency: ", num_battles / gap_count);