Algorithm Transparency

Every winner is chosen
100% fairly

Our open-source algorithm ensures complete fairness. More entries = better odds, but every participant has a real chance to win. Zero manipulation, zero bias, zero exceptions.

Our Transparency Promise

We believe trust is earned through transparency. Every aspect of our winner selection is open for inspection. No black boxes, no hidden algorithms, no secret parameters. What you see is exactly what happens.

The Algorithm Behind the Magic

Every winner selection happens through this exact code. No hidden functions, no secret parameters - just pure, transparent mathematics.

winnerSelection.ts
1
2// src/lib/services/winnerSelection.ts
3import { GiveawayEntry } from '@/types/giveaway';
4
5/**
6 * Select winners using weighted random selection
7 * @param entries Array of giveaway entries with user IDs and entry counts
8 * @param winnerCount Number of winners to select
9 * @returns Array of selected winner user IDs
10 */
11export function selectWinners(entries: GiveawayEntry[], winnerCount: number): string[] {
12 // Input validation
13 if (!entries || entries.length === 0) {
14 return [];
15 }
16
17 // Create weighted pool of entries based on entry count
18 const entryPool: string[] = [];
19
20 for (const entry of entries) {
21 // Add user_id to the pool based on their entry count
22 for (let i = 0; i < entry.entries_count; i++) {
23 entryPool.push(entry.user_id);
24 }
25 }
26
27 // Randomly select winners without duplicates
28 const winners: string[] = [];
29 const winnerSet = new Set<string>();
30
31 // Limit winner count to available unique participants
32 const uniqueParticipants = new Set(entries.map(entry => entry.user_id));
33 const availableWinnerCount = Math.min(winnerCount, uniqueParticipants.size);
34
35 // If there are no entries or the pool is empty, return empty array
36 if (availableWinnerCount === 0 || entryPool.length === 0) {
37 return [];
38 }
39
40 // Select winners
41 while (winners.length < availableWinnerCount && entryPool.length > 0) {
42 // Select a random entry from the pool
43 const randomIndex = Math.floor(Math.random() * entryPool.length);
44 const selectedUserId = entryPool[randomIndex];
45
46 // If this user hasn't already been selected as a winner, add them
47 if (!winnerSet.has(selectedUserId)) {
48 winners.push(selectedUserId);
49 winnerSet.add(selectedUserId);
50 }
51
52 // Remove the selected entry from the pool
53 entryPool.splice(randomIndex, 1);
54 }
55
56 return winners;
57}

Key Algorithm Steps

Click on any step below to see its implementation in the code

Line 12

Entry Validation

First, we verify there are participants to select from. If no entries exist, no winners can be chosen.

Line 17

Weighted Pool Creation

This is where fairness begins. We create a pool where each user gets multiple entries based on their task completion count.

Line 40

Main Selection Loop

The core winner selection process. Continues until we've selected all winners or exhausted the entry pool.

Line 42

Random Selection

Pure mathematical randomness using Math.random() to select from the weighted pool. No bias, no manipulation possible.

Line 46

Duplicate Prevention

Ensures each participant can only win once per giveaway, maintaining fairness for all community members.

How Fairness Works

See exactly how our algorithm ensures every participant gets a fair chance, with better odds for those who engage more.

1

Entry Collection

Users complete tasks and earn entries based on their actions

2

Weighted Pool Creation

Every entry gets added to the selection pool based on tasks completed

3

Random Selection

Pure mathematical randomness selects from the weighted pool

4

Duplicate Prevention

Ensures each user can only win once per giveaway

5

Winner Confirmation

Selected winners are verified and announced

Real Example

Alice completes 3 tasks, Bob completes 1 task, Charlie completes 5 tasks. The pool contains 9 total entries with proportional winning chances.

Alice

3 entries earned

33% chance

Bob

1 entry earned

11% chance

Charlie

5 entries earned

56% chance

The Pool (9 total entries)

Each dot represents one entry. Winner is selected randomly from all entries.

No More Rigged Giveaways

A Discord giveaway bot that shows exactly how winners are chosen

The Problem

Most Discord giveaway bots are black boxes. Even when the bot is legitimate and truly random, your community has no way to verify this. They can't see the algorithm, can't check the process, can't prove winners weren't hand-picked.

Without transparency, every giveaway feels suspicious. Your members start wondering if it's actually fair. Trust dies, engagement drops.

We got tired of watching communities die from broken trust

The Solution

Never worry about engagement drops from rigged giveaway accusations again. When members question fairness, just link them to this page.

ScopliDrop certifies that server owners cannot edit giveaways or choose winners. Period.

We have a 'manually end giveaway' feature, but this only triggers our winning selection algorithm - nothing else. Server admins CANNOT choose winners by any means. This is our promise.

Fairness Questions

Learn how we ensure every giveaway is transparent, secure, and genuinely fair for all participants.

Ready for Truly Fair Giveaways?

Join thousands of Discord communities who've switched to transparent, verifiable giveaways.

Start Your Fair Giveaways
Join the Fair Revolution

Ready to Run Truly Fair
Giveaways Today?

Join thousands of Discord communities who've switched to transparent, verifiable giveaways. Start free, prove fairness from day one.