What happens if you hand a model a random opening and then let go?
Claude Haiku 4.5 and Claude Sonnet 5 play 30 rounds of rock paper scissors as a real conversation. A random number generator writes each player's first 6 moves; the models play those out, and then decide the remaining 24 for themselves.
The result in one line
Across the 24 rounds the models actually chose, Sonnet won 5, Haiku won 1, with 18 draws. Every earlier version of this experiment ended in a dead heat, most of them in an unbroken run of draws. The scripted opening is what made a difference visible.
The whole match
Why the opening is scripted
Left to themselves with reasoning switched off, both models do the same thing: they play rock, then paper, then scissors, then rock again, following the order the three options are listed in the prompt. Both sides do it at the same time, so the match becomes an unbroken chain of draws. An earlier 50-round run ended 50 draws out of 50, with the two move sequences identical character for character.
Telling a model it may not open with rock does not help. It opens with paper instead, the next item on the list, and so does its opponent. The cycle just shifts by one.
What does help is starting the match somewhere that has no pattern to continue. The script here is built so the two players are pulled apart from the first move: no draws, and the 6 scripted rounds split evenly, 3 wins each. By the time the models take over there is no clean cycle in the transcript to fall back into.
The script the models were given
Each player received its own move list in its system prompt and played it out itself, so those rounds sit in its transcript as its own turns rather than as something it was told about. Both models followed the script for all 6 rounds without a single deviation.
Rock-paper-scissors, 30 rounds, vs another AI. Reply with one word only: rock, paper or scissors. Your moves for the first 6 rounds have already been decided by a random number generator: 1. scissors, 2. paper, 3. scissors, 4. paper, 5. paper, 6. paper. Play exactly those moves in those rounds. From then on you decide for yourself.
What each model did once it was free
Sonnet's wins came from reading Haiku rather than from being unpredictable. Haiku settled into short repeating runs, and Sonnet took 5 rounds off it, including two in a row at the end.
A model from a different company
Everything above is Claude against Claude. To check whether the lock-in is a quirk of one company's models, the same 30-round format was run against DeepSeek V4 Flash, reached through the OpenCode Go gateway rather than the Claude Code CLI: a different vendor, a different API, a different transport for the conversation.
It behaves the same way. With reasoning switched off on both sides, 22 of the 24 free rounds were draws and the two move sequences were identical from the third round onward. The rock, paper, scissors cycle is not a Claude habit; it is what these models do when asked for a move with no deliberation, whoever built them.
With its reasoning left on, DeepSeek won twice as many rounds as Haiku — and took an average of 17.6 seconds per move against Haiku's 1.9, with one move taking 63 seconds. That result says something about thinking versus not thinking, not about which model is stronger.
| Match | Free rounds | Haiku | DeepSeek | Draws | Avg latency |
|---|---|---|---|---|---|
| DeepSeek reasoning, Haiku not DeepSeek was left with its chain of thought on while Haiku had thinking switched off. Not a fair fight, and the section below explains why it was run that way by accident. |
24 | 5 | 10 | 9 | 1879 / 17608 ms |
| Neither model reasoning The same match with reasoning suppressed on both sides, which is the only setting where the two are actually comparable. |
24 | 0 | 2 | 22 | 1777 / 542 ms |
A note on how easily this was nearly got wrong: DeepSeek returns its
chain of thought in a separate reasoning_content field, and those tokens are folded into
completion_tokens with no separate count. Reading the usage numbers alone, the model looks
like it answered in one word without thinking. The only reliable tell was the latency.
Every version tried
Only rounds the models chose are counted; scripted rounds are excluded. The last row is the match above.
| Opening | Free rounds | Haiku | Sonnet | Draws |
|---|---|---|---|---|
| No opening at all Models free from round 1. |
50 | 0 | 0 | 50 |
| Round 1 may not be scissors A rule in the system prompt, no RNG. |
10 | 0 | 0 | 10 |
| Round 1 may not be rock Same, the other way round. |
10 | 0 | 0 | 10 |
| 4 random rounds narrated RNG played the opening; the models were told about it. |
10 | 1 | 0 | 9 |
| 5 random rounds played by the models Each model was given its own RNG script to play out. The two scripts happened to overlap in 4 of 5 rounds. |
10 | 0 | 0 | 10 |
| 4 balanced rounds played by the models Scripts constrained: no draws, wins split evenly. |
11 | 2 | 2 | 7 |
| 6 balanced rounds, 30 total
This page. |
24 | 1 | 5 | 18 |
How the models were called
Both players are the same Claude Code binary with every default stripped away: no tools, no built-in system prompt, no settings files. Reasoning is switched off on both sides, so what you see is the model's immediate response. Each player holds one session for the whole match, so the conversation really is 30 exchanges long rather than one long recap.
MAX_THINKING_TOKENS=0 claude -p --model MODEL --effort low --tools "" \ --system-prompt SYSTEM --setting-sources "" --strict-mcp-config \ --disable-slash-commands --resume SESSION --output-format json
Each user turn reports only the round just played, in the form you: paper, opponent: scissors, result: you lost, followed by a request for the next move.
All 30 rounds
| # | Haiku | Sonnet | Winner | Latency |
|---|---|---|---|---|
| 1 rng | ✌️ scissors | ✊ rock | sonnet | 1974 / 2892 ms |
| 2 rng | ✋ paper | ✊ rock | haiku | 2191 / 3753 ms |
| 3 rng | ✌️ scissors | ✊ rock | sonnet | 2172 / 2275 ms |
| 4 rng | ✋ paper | ✊ rock | haiku | 1832 / 2443 ms |
| 5 rng | ✋ paper | ✊ rock | haiku | 1855 / 3192 ms |
| 6 rng | ✋ paper | ✌️ scissors | sonnet | 1803 / 5816 ms |
| 7 | ✊ rock | ✋ paper | sonnet | 1592 / 5170 ms |
| 8 | ✌️ scissors | ✌️ scissors | tie | 1611 / 7864 ms |
| 9 | ✊ rock | ✊ rock | tie | 2003 / 2809 ms |
| 10 | ✋ paper | ✋ paper | tie | 1804 / 2520 ms |
| 11 | ✌️ scissors | ✌️ scissors | tie | 2197 / 2559 ms |
| 12 | ✊ rock | ✊ rock | tie | 1704 / 2369 ms |
| 13 | ✋ paper | ✋ paper | tie | 1705 / 2650 ms |
| 14 | ✊ rock | ✊ rock | tie | 1617 / 2752 ms |
| 15 | ✋ paper | ✌️ scissors | sonnet | 1986 / 3330 ms |
| 16 | ✊ rock | ✊ rock | tie | 1768 / 2456 ms |
| 17 | ✋ paper | ✌️ scissors | sonnet | 1811 / 2627 ms |
| 18 | ✊ rock | ✊ rock | tie | 2069 / 2472 ms |
| 19 | ✌️ scissors | ✌️ scissors | tie | 1870 / 2615 ms |
| 20 | ✊ rock | ✊ rock | tie | 1786 / 3575 ms |
| 21 | ✋ paper | ✋ paper | tie | 1957 / 3063 ms |
| 22 | ✊ rock | ✌️ scissors | haiku | 1892 / 2554 ms |
| 23 | ✊ rock | ✋ paper | sonnet | 1996 / 2593 ms |
| 24 | ✋ paper | ✌️ scissors | sonnet | 1905 / 2641 ms |
| 25 | ✊ rock | ✊ rock | tie | 2015 / 2651 ms |
| 26 | ✋ paper | ✋ paper | tie | 1977 / 2505 ms |
| 27 | ✌️ scissors | ✌️ scissors | tie | 1757 / 2639 ms |
| 28 | ✊ rock | ✊ rock | tie | 1863 / 2491 ms |
| 29 | ✋ paper | ✋ paper | tie | 2014 / 2906 ms |
| 30 | ✌️ scissors | ✌️ scissors | tie | 1997 / 2899 ms |
Caveat worth keeping in mind: this is one match of 24 free rounds. It is enough to show that a scripted opening breaks the deadlock, and not nearly enough to rank the two models at rock paper scissors.
Raw data: rps_big.sqlite · code: rps_multiturn.py, build_site2.py