당첨 결과는 전 세계적으로 신뢰받는 난수 생성 네트워크인Drand 에서 생성된 난수를 기반으로 합니다. Drand 는 누구나 접근 가능하며, 30초마다 새로운 난수를 공개합니다. 이 난수는 사전에 예측하거나 조작할 수 없습니다.
drand 네트워크 자세히 보기 →추첨에 사용되는 알고리즘은 완전히 공개되어 있어, 누구나 해당 난수와 알고리즘을 이용해 결과를 독립적으로 검증할 수 있습니다. 이로 인해 결과 조작이나 은폐는 사실상 불가능합니다.
/**
* drand 난수와 LCG를 사용해 중복 없이 여러 명을 추첨하는 함수
* @param randomness drand에서 받은 64자리 16진수 문자열
* @param items 후보 항목 배열
* @param count 추첨할 개수
* @returns 중복 없는 랜덤 추첨 결과 배열
*/
export function drawWinnersWithLCG(randomness: string, items: string[], count: number): string[] {
if (count > items.length) throw new Error("추첨 개수가 항목 수보다 많습니다.");
// drand randomness를 32비트 정수 시드로 변환
let seed = parseInt(randomness.slice(0, 8), 16);
const arr = [...items];
const winners: string[] = [];
for (let i = 0; i < count; i++) {
// LCG로 새로운 난수 생성
seed = (seed * 1664525 + 1013904223) % 0x100000000;
// 난수로 인덱스 선택
const idx = seed % arr.length;
winners.push(arr[idx]);
arr.splice(idx, 1); // 중복 방지
}
return winners;
}
이 투명한 알고리즘으로 누구나 결과를 독립적으로 검증할 수 있습니다