| # | Picked item | Group | Weight | Source | Copy |
|---|---|---|---|---|---|
| {{ row.slot }} | {{ row.label }} | {{ row.group || '-' }} | {{ row.weightDisplay }} | {{ row.source }} |
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.
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.
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.
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.
| 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 |
| 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 |
weight=... or group=... attributes only where needed.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.
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.
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.
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.
Without replacement removes a selected item from the pool for the rest of the run. With replacement keeps it eligible, so duplicates can appear.
No. The package keeps all effective chances equal unless weighted mode is explicitly enabled.
Because exclusions, deduplication, uniqueness, or group caps can still make that label ineligible by the time forced picks are applied.
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.