Draw Manifest
{{ headlinePick }}
{{ drawRows.length }} picks from {{ candidateCount }} candidates
{{ policyLabel }} {{ weightModeLabel }} RNG: {{ rngLabel }} Seed {{ seedDisplay }} Group cap {{ groupCapValue }} Odds modeled ({{ simulationRunsValue }} runs)
Candidate list
Drop a .txt or .csv list file
Drop files to replace the list quickly.
Default weight
Max / group
runs
# Picked item Group Weight Source Copy
{{ row.slot }} {{ row.label }} {{ row.group || '-' }} {{ row.weightDisplay }} {{ row.source }}
Method currently used
  • {{ methodSummary }}
  • {{ oddsSummary }}
  • Constraint filters are applied before draw: exclude list, must-include list, then optional group cap.
Recommended run setup
  1. {{ tip }}
Risk checks before publishing winners
  • Verify candidate count and constraint flags in this run snapshot.
  • Re-run with the same seed to confirm deterministic replay.
  • If fairness is business-critical, keep simulation runs above 1000 before finalizing.

      
Recent runs
  • {{ entry.time }} {{ entry.count }} picks
    {{ entry.preview }}
:

Introduction

Random selection sounds simple until the draw has to be fair, repeatable, and explainable after the fact. The moment you add weights, exclusions, must-include names, or group caps, a basic shuffle stops being enough. This picker is built for that more realistic case.

The package can draw one or more results from a candidate list, either with replacement or without it. It supports per-entry weights, seed-based replay, forced inclusions, exclusions, optional deduplication, group-based limits, and a Monte Carlo estimate of inclusion odds. That turns the tool from a casual name spinner into a small audit surface for controlled selection.

A teacher might use it to rotate speakers without repeating the same student in a round. A moderator might need one guaranteed participant plus a fair random remainder. A team lead might want weighted picks while ensuring no more than one result comes from the same group. All of those cases are still random draws, but they are not the same draw.

The result views reflect that. The Draw Manifest shows exactly who was chosen, in what slot, and why the pick entered the run. Fairness Notes explains the active method, constraints, and replay advice. Selection Wheel visualizes the current picks. Inclusion Odds Donut estimates who is most likely to appear under the current rules, while Weight Ring Map shows how declared input weights are distributed before the draw even runs.

The package is still a decision helper, not a guarantee of moral fairness. If the input list is biased, the weights are poorly chosen, or the constraints are political rather than neutral, the draw will faithfully reproduce those choices. The safest way to use the tool is to make the rules explicit before the picks are generated.

Everyday Use & Decision Guide

Start with the candidate list, one entry per line. Optional attributes are added after a pipe using weight=... and group=.... If the draw is meant to be plain and equal, leave weights off and keep the default policy. If the draw needs unequal chances or one-per-group protection, turn those on deliberately rather than halfway through the decision.

The biggest practical choice is replacement policy. Without replacement means a selected entry leaves the pool for the rest of that run, which is the right fit for turn order, winner lists, or most "pick K distinct items" tasks. With replacement allows the same entry to be drawn again later in the same run, which is useful only when repeat outcomes are genuinely acceptable.

The seed controls reproducibility. A non-empty seed makes the run replayable as long as the list and settings stay unchanged. Leaving the seed blank switches the tool to a non-deterministic random source when available. Use a seed whenever the draw needs to be reviewed later, documented for others, or replayed in front of a group.

Constraints are applied before the random choice is finalized. Exclusions remove labels from the candidate pool. Must-include labels are inserted first when they remain eligible. Group caps limit how many picks can come from the same named group. Deduplication collapses repeated labels in the input manifest. Those controls can make a draw feel more "fair" in practice, but they also change the meaning of the outcome, so the manifest and fairness notes should be read together.

The chart tabs are there to answer different questions. Selection Wheel is mainly visual feedback on the outcome. Inclusion Odds Donut is a modeled estimate based on repeated simulated runs, which makes it a planning surface rather than a proof. Weight Ring Map is a pre-draw sanity check for how strongly the input weights are skewing the pool. If the charts surprise you, adjust the rules before running another official draw.

Technical Details

The parser treats each non-empty line as one candidate and only recognizes two inline attributes after pipe separators: weight and group. Everything else is ignored. Once the manifest is parsed, the package optionally deduplicates labels, applies the exclusion list, and discards non-positive effective weights when weighted mode is enabled.

Unweighted draws are straightforward. Without replacement, the tool uses a Fisher-Yates shuffle and takes the first K eligible entries. With replacement, each pick samples uniformly from the current full pool, so the same label can appear multiple times in one run.

Weighted draws split into two different algorithms. With replacement, each pick uses roulette-style selection where the chance of item i is proportional to its weight. Without replacement, the package uses weighted priority keys of the form u^(1/w) and keeps the highest keys, which is a standard way to perform weighted sampling without replacement. That distinction matters because "weighted" does not mean the same thing once uniqueness is enforced.

P (i) = 1N P (i) = wi wj ki = u1/wi

Seeds are implemented through a deterministic pseudo-random generator seeded from a 128-bit hash of the seed string. If no seed is provided, the script prefers crypto.getRandomValues() and falls back to Math.random() only when Web Crypto is unavailable. That is why the summary badges distinguish seeded, crypto-backed, and ordinary fallback randomness.

Must-include entries are processed before the remaining draw. They still respect uniqueness and group caps, so a forced label can fail to enter if an earlier forced label exhausted the group allowance. After the picks are finalized, the package stores the run in local history, exposes the chosen seed for replay, and builds a JSON record of inputs, candidates, picks, odds estimates, and past runs.

The Inclusion Odds Donut is intentionally described as modeled odds rather than exact probabilities. The tool estimates inclusion chances with repeated simulated runs using the current rules and retains the top 24 rows for display. That makes it useful for understanding how weights and caps are shaping the draw, but it should not be mistaken for a closed-form proof under every constrained combination.

Draw policies and their effects
Mode Selection rule What changes in practice
Uniform, without replacement Fisher-Yates shuffle followed by first K items No duplicates in a run and equal single-run chances among eligible items
Uniform, with replacement Independent uniform sample per pick Duplicates remain possible in the same run
Weighted, without replacement Priority keys u^(1/w) with highest keys retained Weights influence inclusion while uniqueness remains enforced
Weighted, with replacement Roulette draw proportional to weight each pick Weights influence every pick and repeats are still possible
Result surfaces and exports
Surface What it shows Exports available
Draw Manifest Slot, label, group, effective weight, and source of each selected pick CSV copy, CSV download, and DOCX export
Fairness Notes Method summary, constraint reminders, and replay guidance Included in JSON state
Selection Wheel Visual share of the actual picks PNG, WebP, JPEG, and CSV
Inclusion Odds Donut Modeled inclusion odds from repeated simulations PNG, WebP, JPEG, and CSV
Weight Ring Map Distribution of declared manifest weights PNG, WebP, JPEG, and CSV
JSON Inputs, candidates, picks, odds rows, and local history Clipboard copy and JSON download

Step-by-Step Guide

  1. Enter one candidate per line and add weight=... or group=... attributes only where needed.
  2. Choose the number of picks and decide whether duplicates are allowed by selecting with or without replacement.
  3. Set a seed if the draw must be reproducible; leave it blank only when replay does not matter.
  4. Apply exclusions, must-include labels, deduplication, or group caps before running the draw.
  5. Run the draw and read the Draw Manifest first, then check Fairness Notes and the odds chart if the rule set is complex.
  6. Use CSV, DOCX, chart, or JSON exports according to how the result needs to be documented or shared.

Interpreting Results

The most important result surface is the Draw Manifest, because it shows not just who was selected, but how the pick entered the run. A source value such as must-include or ordinary draw tells you whether the outcome came from a forced rule or the random engine itself.

The odds donut is best read as a diagnostic estimate. It can show that a heavy weight or a tight group cap is dominating inclusion chances, but it does not replace the actual rules of the run. If the simulation view looks unfair, the correct fix is usually to change the manifest or constraint set before the next draw, not to distrust the completed one retroactively.

Seed replay is what turns the draw from a black box into an auditable process. If a run matters, keep the seed, the manifest, and the settings together. Without them, you still have a result, but you no longer have a reproducible explanation for how it happened.

Worked Examples

Picking three students without repeating a team

A teacher enters ten names, tags them with team groups, and turns on a group cap of one. Without replacement is selected, so each chosen student leaves the pool after selection. The manifest then shows a three-person lineup that spans teams and can be replayed later with the same seed.

Guaranteeing one participant before a weighted remainder

A moderator needs Alice in the lineup but still wants the rest of the panel chosen randomly. Alice is added to the must-include list, weights are enabled for the remaining entries, and the draw runs without replacement. The manifest makes that split explicit by marking Alice's slot as forced and the others as random picks.

Checking whether one weight is overpowering the pool

A team lead gives one candidate a weight of 5 while the rest remain at 1. Before finalizing the draw, they inspect the Weight Ring Map and Inclusion Odds Donut. If the modeled odds look too skewed for the intended policy, the fix is to adjust the weights before running the official selection.

FAQ

What is the difference between with replacement and without replacement?

Without replacement removes a selected item from the pool for the rest of the run. With replacement keeps it eligible, so duplicates can appear.

Do weights matter when weighted mode is off?

No. The package keeps all effective chances equal unless weighted mode is explicitly enabled.

Why can a must-include name still fail to appear?

Because exclusions, deduplication, uniqueness, or group caps can still make that label ineligible by the time forced picks are applied.

Why are the inclusion odds only an estimate?

The tool models them by repeated simulation under the current rule set. That is useful for planning, but it is not a symbolic proof of every constrained case.

Glossary

With replacement
A draw policy where a selected item stays eligible for later picks in the same run.
Without replacement
A draw policy where a selected item leaves the pool for the rest of the run.
Effective weight
The numeric value the package actually uses when weighted mode is enabled.
Group cap
A per-run maximum on how many selected items may come from the same named group.
Seed replay
Running the same manifest and settings with the same seed so the draw can be reproduced exactly.