Notes › Resources › What does a weight of 30 mean on a spinner? Sector angles and draws with or without replacement

What does a weight of 30 mean on a spinner? Sector angles and draws with or without replacement

Before last year's annual party, HR handed me a handwritten prize list: first prize an iPhone, second prize headphones, third prize a thermos, a consolation prize of a pack of tissues, and a separate slot at the bottom for "thanks for playing". Her only instruction was that the thanks-for-playing slot had to take up half, without letting the audience see through that the slot was empty. I pushed percentages around in Excel for three rounds and the denominator never came out right. Then I changed approach: stop forcing ratios, just give each item a weight. This post is about that chain, and about whether the person drawn second or third gets a worse deal under the two drawing methods.

1. Total weight 60: shares, sector angles, 300,000 test draws

I entered that list into the prize-weight preset of Lucky Wheel. The five weights are 1, 3, 6, 20 and 30, totalling 60; each share is the item's weight divided by 60, and the sector angles are laid out by the same ratio. I also ran 300,000 weighted draws with a fixed seed (mulberry32, 20261021) to check the numbers, and rerunning with the same seed gives identical values.

PrizeWeightTheoretical shareSector angleMeasured frequencyRelative deviation
First prize, iPhone11.6667%6.0°1.70%1.70%
Second prize, headphones35.0000%18.0°4.95%-0.93%
Third prize, thermos610.0000%36.0°9.96%-0.39%
Consolation, a pack of tissues2033.3333%120.0°33.37%0.11%
Thanks for playing3050.0000%180.0°50.02%0.04%

The two 1.70% values in the first row need to be read separately. The measured frequency of 1.70% is the share of first-prize hits in 300,000 draws, against a theoretical 1.67% (exactly 1.6667%). The last column is (measured - theoretical) divided by theoretical, which happens to come out at 1.70% as well; that number says the result sits about one point seven percent above theory, not that the chance itself is 1.70%. The second prize already shows the spread: 4.95% against 5.00%, a deviation of -0.93%. Differences like this are sampling noise; a larger sample only gets closer to theory.

2. With replacement: every round is independent, and a repeat is only a matter of time

With "remove after draw" unchecked, every round has the same 40 items and each item has a 2.5000% chance, and one round does not affect the next. What does become a problem is hitting the same person again after a few spins. The table below covers draws with replacement only; the without-replacement numbers are in section 3, and the two sets should not be read side by side.

SpinsAll distinctAt least one repeat
297.5000%2.5000%
392.6250%7.3750%
577.1103%22.8897%
847.3144%52.6856%
1029.3349%70.6651%
154.8989%95.1011%
200.3050%99.6950%

After 20 draws the chance of at least one repeat is 99.6950%; at 30 draws the chance that everything is distinct is down to 1.950e-7, which you can treat as certain repetition. Going the other way, seeing all 40 items at least once takes about 171.14 draws on average (the coupon collector problem), far slower than intuition suggests.

3. Without replacement: the denominator drops by one each round, and order is not biased

At a class meeting we drew 3 people for duty, and someone asked on the spot whether the second person drawn gets a raw deal. Spread 6 equally weighted items out: the chance for a single item starts at 16.67%, and each hit is removed, so round 2 is 20.00%, round 3 is 25.00% and round 4 is 33.33%, until only the second and sixth items are left. The denominator drops by 1 each round and the conditional probability keeps climbing, but that is the probability within each round, not the chance that a given person ends up selected.

What you should compute is the latter: drawing 3 people out of 40 without replacement, the chance that a given person is among those 3 is 3/40 = 7.50%. The chance that position k is one particular named person is 1/40 = 2.5000% for k = 1, 2 and 3; for position 2 it is 39/40 times 1/39, still 2.5000%. Being drawn later is no disadvantage. For how ordered and unordered cases differ, see Permutations vs combinations. Even with removal checked, items are only actually deleted when opts.length > 2; with 2 items left the tool only shows a hint and stops deleting.

4. Input format: what is accepted and what gets rewritten

One item per line. Between the name and the weight, a half-width colon, a half-width comma, a full-width colon and a full-width comma are all accepted; Zhang San:3, Li Si,2 and Wang Wu:1 go into the same wheel, while #comment line and blank lines are ignored. For the annual party list I typed it like this:

First prize iPhone:1
Second prize headphones:3
Third prize thermos:6
Consolation tissues:20
Thanks for playing:30
  • Only positive numbers count as weights: banana:0, orange:-5 and peach:abc are all treated as 1. A non-positive weight does not make an item impossible to draw; it just gets a sector of weight 1.
  • If a name contains a colon, the line is split at the last separator: apple::2 is the name "apple:" with weight 2, and F:1.5:2 is the name F:1.5 with weight 2. Mixing separators on one line does not split it into two items either: hotpot:2, malatang:3 is one item with weight 3.
  • Display is capped at two decimals: 0.333 shows as 0.33 and 2.675 shows as 2.68, but calculations use the original values. The six items A:1.5 / B:1.5 / C:0.333 / D:2.675 / E:1e3 / F:1.5:2 total 9.01. That does not mean you can only enter two decimals.
  • Scientific notation is not recognised: the line parser only matches \d+(\.\d+)?, so E:1e3 becomes a whole line treated as a name with weight 1, not 1000. Items with weight 1 drop the colon when written back, so X:1 is stored as X.

5. The pointer never straddles a boundary, and the result shares the drawing's angles

The landing point is jitter = span × (0.14 + rand × 0.72), so the pointer only stops between 14% and 86% inside a sector; with 60 equal items at 6° each, the minimum margin is 0.84°. The wheel always spins 5, 6 or 7 extra turns and then adds the alignment angle, with a random duration of 3.6 to 5 seconds. The stopping result is read back from the final angle to find which sector the pointer is in, so drawing and judging share the same set of angles. Selection uses cumulative subtraction: Math.random() times the total weight, then subtract item by item, and the item where the remainder drops to zero or below wins. The probability equals the weight share, but that is pseudorandom, not physical randomness, and it cannot promise absolute fairness.

Once the list is final, share a link: the options and weights are encoded into the #opts= fragment of the URL, and whoever opens it gets the same wheel. It is only a URL fragment, so nothing reaches a server and there is no cross-device sync; reading back fewer than 2 items is rejected. 15 characters (including 3 newlines) encode to 48 characters, and 3 Chinese lines of 22 UTF-8 bytes encode to 32 characters, or 36 characters in the URL. If you only need to shuffle a list of 40 people and do not need to draw each prize, Random File Picker is less work.

Q: Can weights be decimals?

Yes. Only the relative ratio matters, so 1 and 2 describe the same wheel as 1.5 and 3; display keeps two decimals, but conversion uses the original values.

Q: How do the probabilities change with and without removal?

Without removal, each of the 40 items has a 2.5000% chance every round, and 3 draws give a 7.3750% chance of at least one repeat. With removal, the denominator drops by 1 each round and the per-item chance rises; drawing 3 people from 40 gives a given person a 7.50% chance of being in the group.

Q: Can I send the list to a colleague?

Yes. The list goes into the #opts= fragment of the URL, and opening it rebuilds the same wheel; nothing is stored on a server, and there is no shared copy for two people to edit.

Back to that slot of HR's: what she took away was the weight table 1, 3, 6, 20, 30, with thanks-for-playing at 50.0000% and a 180.0° sector. The annual party leaves removal off, because the prize pool should not shrink with every spin; the price is a 70.6651% chance of hitting the same name again within 10 draws. The class meeting turns removal on, because it wants 3 different people; the price is that the per-item chance climbs to 33.33%. Neither method is more fair than the other; each one just has to suit the game.

📎 Related articles

SOS is 9 tones, the full alphabet is 104: how Morse timing is calculated 2026-10-21 Why white text on gradients is hard to read: checking WCAG contrast at every stop 2026-10-21 Enlarging old photos without blur: how much detail enhancement can recover 2026-10-15 Barcodes for inventory labels: choosing between CODE128 and EAN-13 2026-10-15 Making a perler bead pattern: turning a photo into a colour chart and grid 2026-10-15