NRMP-like market: a saved run
A saved example run
One run of the simulator, saved with its parameters and seed, so that everyone sees the same market: its key numbers, who got an interview and a match by applicant strength, its checks, downloads, stages, version stamps and parameters.
What to do here
- The tabs above lead to the population, the views before interviews, the applications, the match, and the lists of applicants and programs.
- Run this market yourself to change its parameters, or to draw it again with another seed; that needs a free account.
A saved run of the simulator: everyone who opens it sees this same market. Simulated from the assumptions in the parameters; not a prediction of any real applicant's or program's match.
About this example
The simulator's default market. Applicants come in five groups, in proportions like those of the Main Residency Match (US MD seniors, US DO seniors, US and non-US international medical graduates, and others), and there are slightly fewer positions than applicants. Applicants agree only moderately on which programs are best, as programs do on applicants, and each side sees the other through noise before interviews.
What to look at
- Match: Who matched, by applicant group and by strength, and which choice on their list they got.
- Applications and interviews: How the interviews are spread: who holds many, and who has none.
- Before interviews: How well each side can judge the other before interviews.
- Population: The applicant groups and the programs the market was generated with.
This is one run of the market, with seed 2026 and model 2.1. Another seed draws other applicants and programs, so the numbers differ from run to run: run the market yourself to see by how much, or to change its parameters. The run's files are kept with the project's source code.
Summary
- Market
- 1,000 × 142
- Applicants per position
- 1.080
- Match rate
- 92.2%
- Positions filled
- 95.7%
- Seed
- 2026
- Matched to first choice
- 41.4%
- Interviews per applicant
- 8.2
- Time
- 74 ms
- Saved
- 2026-10-06
- Applicants
- 1,000 (generated)
- Programs
- 142 with 926 positions (generated)
Checks passed The match is stable, within capacity and follows the rank order lists. See the match.
Which applicants get an interview and a match?
Every applicant counted once: whether they had at least one interview, and whether they matched. With Colour by strength on, each stage splits into five groups by strength percentile (fifths; applicants of equal strength stay in the same group), from the bottom 20% in red through the middle in grey to the top 20% in blue, and each drop-off shows which groups it holds, so the quality of the applicants can be followed through the stages. Each band's width is a number of applicants. Hover a stage or a band for its count and its share of all applicants (with the switch on, of its group) and to highlight its path; a band after the first stage also gives its share of the stage it leaves. No interview splits into never invited and invited without an interview. With the switch on, each drop-off's bar is split into the groups' colours in proportion, and the small bar beside its label shows the same mix from weaker to stronger; hover the drop-off for each group's count, its share of the drop-off and the share of the group it holds: a group that loses a larger share of its applicants does worse. Strength is the applicant's latent strength. The view all programs share is mostly strength, mixed with the applicant's attributes, and each program sees it only through its own noisy view. The funnel above counts applications instead: strong applicants hold many interviews but match only once.
Learn more in the helpOf 1,000 applicants, 961 had at least one interview and 886 matched (88.6%); 39 had no interview, 39 of them never invited. By strength, 68.0% of the bottom 20% matched, against 96.0% of the top 20%. The bottom 20% make up 23 of the 39 with no interview and 41 of the 75 interviewed but not matched.
- Bottom 20%: 0–20
- 20th–40th percentile: 20–40
- 40th–60th percentile: 40–60
- 60th–80th percentile: 60–80
- Top 20%: 80–100
The numbers
| Who | Strength (z) | Applicants | Never invited | Invited, no interview | Interviewed | Interviewed, not matched | Matched | Share matched |
|---|---|---|---|---|---|---|---|---|
| Bottom 20% | -4.99 to -1.28 | 200 | 23 | 0 | 177 | 41 | 136 | 68.0% |
| 20th–40th percentile | -1.28 to -0.45 | 200 | 3 | 0 | 197 | 13 | 184 | 92.0% |
| 40th–60th percentile | -0.44 to 0.21 | 200 | 5 | 0 | 195 | 12 | 183 | 91.5% |
| 60th–80th percentile | 0.21 to 0.90 | 200 | 4 | 0 | 196 | 5 | 191 | 95.5% |
| Top 20% | 0.90 to 4.01 | 200 | 4 | 0 | 196 | 4 | 192 | 96.0% |
| All applicants | 1,000 | 39 | 0 | 961 | 75 | 886 | 88.6% |
Downloads
- Applicants (CSV) – uploads back unchanged
- Programs (CSV) – uploads back unchanged
- The match: every applicant's result (CSV)
- Every program's results (CSV)
- Every application, from signal to match (CSV)
- Diagnostics and versions (JSON)
- Parameters with the seed (JSON)
Model 2.1, engine 2.1.0, app 0.1.0, numpy 2.5.3, Python 3.14.2.
Stages
| Stage | Status | Time | Result |
|---|---|---|---|
| Population | Finished | 1 ms | 1,000 applicants, 926 positions, 142 programs |
| Pre-interview | Finished | 45 ms | 142,000 pairs |
| Applications | Finished | 2 ms | 31,447 applications |
| Signals | Finished | 0 ms | 0 signals |
| Invitations | Finished | 12 ms | 8,203 interviews, 13,969 invitations |
| Interviews | Finished | 3 ms | 8,203 interviews |
| Rank order lists | Finished | 3 ms | 8,203 applicant list entries, 7,451 program list entries |
| Match | Finished | 7 ms | 0 blocking pairs, 886 matched |
Checks
How this match was checked
| Check | Result |
|---|---|
| Blocking pairs: an applicant and a program that rank each other above their match | 0 |
| Programs matched to more applicants than they have positions | 0 |
| Matches that are not on both rank order lists | 0 |
| List entries without an interview | 0 |
| Rank order lists whose ranks are not exactly 1, 2, ..., k | 0 |
| Applicant list entries beyond rank 300 (the NRMP limit) | 0 |
| Both proposing sides match the same applicants and fill each program equally (rural hospitals) | not run |
| No applicant prefers the program-proposing result (applicant optimality) | not run |
The last two checks run when Compare both sides proposing is on in the match settings. The engine is also checked on hundreds of random markets against an independent solver (docs/VALIDATION.md).
Parameters of this run
Show the parameters
Run
- Random seed
- 2026
Market
- Applicants
- 1000
- Applicants per position
- 1.08
- Programs
- blank
- Program sizes
- lognormal
- Mean positions per program
- 6.5
- Program size spread
- 0.8
Applicants
| Name | Share | Strength mean | Strength SD | Applications (mean) | Signals |
|---|---|---|---|---|---|
| us_md | 0.44 | 0.5 | 1.0 | None | None |
| us_do | 0.18 | 0.35 | 1.0 | None | None |
| us_img | 0.09 | -1.0 | 1.0 | None | None |
| non_us_img | 0.25 | -1.3 | 1.0 | None | None |
| other | 0.04 | -0.5 | 1.0 | None | None |
| Attribute | Correlation with strength | Average weight |
|---|---|---|
| board_scores | 0.8 | 0.5 |
| research | 0.5 | 0.3 |
| honors | 0.6 | 0.2 |
Programs
- Quality SD within tiers
- 1.0
| Attribute | Correlation with quality | Average weight |
|---|---|---|
| reputation | 0.9 | 0.5 |
| program_size | 0.0 | 0.2 |
| location | 0.0 | 0.3 |
Preferences
- Applicant agreement
- 0.6
- Program agreement
- 0.7
- Taste share of personal preferences
- 0.5
- Attribute share of the common view
- 0.3
- Weight concentration
- 10.0
Information
- Applicant pre-interview noise
- 0.5
- Program pre-interview noise
- 0.5
- Interview informativeness
- 0.6
- Interview fit shock
- 0.3
- Visibility effect
- 0.0
- Shared error (halo)
- 0.0
Applications
- Application count
- negbin
- Applications (mean)
- 30.0
- Application strategy
- portfolio
- Reach
- 0.25
- Target
- 0.5
- Safety
- 0.25
- Self-assessment error
- 0.5
- Application dispersion
- 0.5
- Target band
- 0.15
Signals
- Signal allocation
- realistic
- Programs using signals
- 1.0
- Signals affect rank lists
- False
Invitations
- Interviews per position
- 10.0
- Invitation strategy
- top_score
- Invitation rounds
- 3
- Screening attribute
- blank
- Screening minimum percentile
- 0.0
- Yield protection
- 0.0
Interviews
- Interviews per applicant (max)
- 12
- Acceptance order
- first_come
Rank order lists
- Applicant rank lists
- all_interviewed
- Applicant list length
- 20
- Program rank lists
- dnr_quantile
- Do-not-rank share
- 0.1
- Reservation utility
- -1.0
Match
- Algorithm
- applicant_proposing
- Compare both sides proposing
- False
Parameter hash 4f847eb3ee9d235859d6ff027cd22c2aa95b28702d8c30c9f34202227f3db10f; population digest f44d6508d12cb5d3341f7660c022025e7e0e50a8a7fde4c75844450d8abc8759.