Fix random song selection bias in daily puzzle generation
This commit is contained in:
@@ -49,13 +49,15 @@ export async function getOrCreateDailyPuzzle(genre: Genre | null = null) {
|
|||||||
// Calculate total weight
|
// Calculate total weight
|
||||||
const totalWeight = weightedSongs.reduce((sum, item) => sum + item.weight, 0);
|
const totalWeight = weightedSongs.reduce((sum, item) => sum + item.weight, 0);
|
||||||
|
|
||||||
// Pick a random song based on weights
|
// Pick a random song based on weights using cumulative weights
|
||||||
|
// This ensures proper distribution and handles edge cases
|
||||||
let random = Math.random() * totalWeight;
|
let random = Math.random() * totalWeight;
|
||||||
let selectedSong = weightedSongs[0].song;
|
let selectedSong = weightedSongs[weightedSongs.length - 1].song; // Fallback to last song
|
||||||
|
|
||||||
|
let cumulativeWeight = 0;
|
||||||
for (const item of weightedSongs) {
|
for (const item of weightedSongs) {
|
||||||
random -= item.weight;
|
cumulativeWeight += item.weight;
|
||||||
if (random <= 0) {
|
if (random <= cumulativeWeight) {
|
||||||
selectedSong = item.song;
|
selectedSong = item.song;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -156,11 +158,13 @@ export async function getOrCreateSpecialPuzzle(special: Special) {
|
|||||||
|
|
||||||
const totalWeight = weightedSongs.reduce((sum, item) => sum + item.weight, 0);
|
const totalWeight = weightedSongs.reduce((sum, item) => sum + item.weight, 0);
|
||||||
let random = Math.random() * totalWeight;
|
let random = Math.random() * totalWeight;
|
||||||
let selectedSpecialSong = weightedSongs[0].specialSong;
|
let selectedSpecialSong = weightedSongs[weightedSongs.length - 1].specialSong; // Fallback to last song
|
||||||
|
|
||||||
|
// Pick a random song based on weights using cumulative weights
|
||||||
|
let cumulativeWeight = 0;
|
||||||
for (const item of weightedSongs) {
|
for (const item of weightedSongs) {
|
||||||
random -= item.weight;
|
cumulativeWeight += item.weight;
|
||||||
if (random <= 0) {
|
if (random <= cumulativeWeight) {
|
||||||
selectedSpecialSong = item.specialSong;
|
selectedSpecialSong = item.specialSong;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user