<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: PullSim</title>
    <description>The latest articles on DEV Community by PullSim (@pullsim).</description>
    <link>https://dev.to/pullsim</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4209169%2F0013920d-28ce-4f06-847a-44b8f1763230.png</url>
      <title>DEV Community: PullSim</title>
      <link>https://dev.to/pullsim</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pullsim"/>
    <language>en</language>
    <item>
      <title>Most pack-opening simulators invent their pull rates — here is what ours actually look like</title>
      <dc:creator>PullSim</dc:creator>
      <pubDate>Sun, 01 Nov 2026 06:49:12 +0000</pubDate>
      <link>https://dev.to/pullsim/most-pack-opening-simulators-invent-their-pull-rates-here-is-what-ours-actually-look-like-5cff</link>
      <guid>https://dev.to/pullsim/most-pack-opening-simulators-invent-their-pull-rates-here-is-what-ours-actually-look-like-5cff</guid>
      <description>&lt;p&gt;Almost every pack-opening simulator does the same thing: the percentages are hard-coded constants. No sample size, no source date, and no way to tell whether a rate came from a published study or from someone's best guess. If the number is wrong, you cannot even tell that it is wrong.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pullsim.com/" rel="noopener noreferrer"&gt;PullSim&lt;/a&gt; is my attempt to build one the other way round. This post is about the awkward part: what the published samples actually support, and where they contradict themselves.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; — the three sets we model have rarest-tier rates of &lt;strong&gt;0.19%&lt;/strong&gt;, &lt;strong&gt;0.56%&lt;/strong&gt; and &lt;strong&gt;0.08%&lt;/strong&gt;. The widest is roughly &lt;strong&gt;7×&lt;/strong&gt; the narrowest. Each of those numbers rests on a &lt;strong&gt;single-digit count of observed packs&lt;/strong&gt;, which is why every rate ships with the interval next to it instead of a bare percentage.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  A rate without a sample size is not a measurement
&lt;/h2&gt;

&lt;p&gt;Here are the three sets we model, with the sample each rate rests on:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Set&lt;/th&gt;
&lt;th&gt;Packs in the source sample&lt;/th&gt;
&lt;th&gt;Rarest modelled tier&lt;/th&gt;
&lt;th&gt;Rate&lt;/th&gt;
&lt;th&gt;Reported 95% interval&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ascended Heroes&lt;/td&gt;
&lt;td&gt;2,000&lt;/td&gt;
&lt;td&gt;Mega Hyper Rare&lt;/td&gt;
&lt;td&gt;0.19%&lt;/td&gt;
&lt;td&gt;±0.18%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prismatic Evolutions&lt;/td&gt;
&lt;td&gt;1,200&lt;/td&gt;
&lt;td&gt;rarest modelled tier&lt;/td&gt;
&lt;td&gt;0.56%&lt;/td&gt;
&lt;td&gt;±0.41%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phantasmal Flames&lt;/td&gt;
&lt;td&gt;5,000&lt;/td&gt;
&lt;td&gt;rarest modelled tier&lt;/td&gt;
&lt;td&gt;0.08%&lt;/td&gt;
&lt;td&gt;±0.08%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A single hard-coded table reused across every set cannot be right for all of them — 0.56% and 0.08% are the same species of claim and a factor of seven apart. That is exactly what most simulators ship.&lt;/p&gt;

&lt;h2&gt;
  
  
  The interval is the interesting part
&lt;/h2&gt;

&lt;p&gt;Look at the Mega Hyper Rare row: 0.19% with an interval of ±0.18%. The interval is almost as large as the estimate itself. That is arithmetic, not noise. 0.0019 multiplied by 2,000 gives about 3.8 expected hits, so the entire estimate for that tier rests on roughly &lt;strong&gt;four packs out of two thousand&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Phantasmal Flames tells the same story from the other direction: 0.08% of 5,000 packs is also about four packs, on a sample two and a half times larger.&lt;/p&gt;

&lt;p&gt;That is the actual state of knowledge, and printing it is the whole difference between a measurement and a number someone typed.&lt;/p&gt;

&lt;p&gt;The per-tier schema is deliberately boring: ratePct, ciPct and samplePacks sit next to poolSize, sourceUrl and sourceDate for every tier, plus alternateRatePct wherever the source article contradicts itself. Null means not established — never zero.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the source articles contradict themselves
&lt;/h2&gt;

&lt;p&gt;I found three cases and kept all of them visible instead of quietly picking one:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Ascended Heroes, Ultra Rare&lt;/strong&gt; — 4.81% in the main table, 20.77% in a detailed section. The main-table figure drives the simulation (it is the set-level summary); the other value is preserved as a note.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prismatic Evolutions, Double Rare&lt;/strong&gt; — 16.51% ±2.05% in the main table, 16.94% ±0.79% in the detailed section. The main-table value drives the simulation; the alternate is preserved.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prismatic Evolutions, Specific Double Rare&lt;/strong&gt; — the article reports 0.94%, but dividing the adopted 16.51% by its 25 cards gives about &lt;strong&gt;0.66%&lt;/strong&gt;. I could not reconcile the two, so I derive the single-card estimate myself instead of quoting the reported figure.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A dataset that hides these becomes easier to read and less true at the same time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Normalising percentages is a bug, not a simplification
&lt;/h2&gt;

&lt;p&gt;Each published tier rate is already an absolute per-pack probability inside a specific slot. The tempting fix is to divide every tier by the sum of the tiers so the numbers add up to 100%. That answers the wrong question.&lt;/p&gt;

&lt;p&gt;Prismatic Evolutions' Special Illustration Rare rate is 2.22%. Flatten the slot so the listed hits must sum to a full outcome and that figure climbs to roughly &lt;strong&gt;29%&lt;/strong&gt;. No sample supports that. What disappeared was the ordinary reverse-holo remainder — the most common outcome in the slot. The correct model draws one random number, walks the tiers by their unmodified cumulative rates, and returns the base card when no threshold is crossed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the data cannot support yet
&lt;/h2&gt;

&lt;p&gt;Null means not established, never zero:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;God Packs and Demigod Packs.&lt;/strong&gt; The Prismatic source discusses both and notes what may have been two Demigod Packs, but could not confirm them. The description is stored, the rate stays null.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Poké Ball Foil / Master Ball Foil.&lt;/strong&gt; These are patterns across cards, not standalone rarity categories, so dividing by the available pool gives a deliberately conservative single-card estimate rather than an invented one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delta Reign.&lt;/strong&gt; Listed, no confirmed rate yet.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The data is open
&lt;/h2&gt;

&lt;p&gt;The whole table — per-tier sample counts, card-pool sizes, source links, and every source conflict above — is published under CC BY 4.0:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dataset card: &lt;a href="https://huggingface.co/datasets/zin294/pullsim-pull-rates" rel="noopener noreferrer"&gt;https://huggingface.co/datasets/zin294/pullsim-pull-rates&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source repository: &lt;a href="https://github.com/zin294/pullsim-pull-rates" rel="noopener noreferrer"&gt;https://github.com/zin294/pullsim-pull-rates&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The arithmetic behind every figure, written up with the three conflicts spelled out: &lt;a href="https://pullsim.com/how-we-calculate/" rel="noopener noreferrer"&gt;https://pullsim.com/how-we-calculate/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you model pack economics, or you just want to know what you are actually buying, recompute the numbers above and tell me where they break.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;AI disclosure: drafted with AI assistance; every figure in this post was verified against the published source articles.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>pokemon</category>
      <category>datascience</category>
      <category>showdev</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
