When AI Refuses to Dream

During our summer vacation in Italy, I had a silly idea: what happens if you feed an image generator random data instead of a prompt?
It’s a bit like provoking hallucinations instead of avoiding them. What do image generators produce that is truly inside them, if the prompt doesn’t carry any meaning at all? I hoped that random input would push the models off their predictable paths and into something unexpected, a bit like the Serendipity Engine I built last year, only without any curation at all.
So I asked Claude Code to help me build a small tool, pointed it at three services (Google’s Gemini 3 Pro Image, OpenAI’s gpt-image-2, and Stable Diffusion 3.5 Large), and let the dice roll. The code and all the images are on GitHub, along with a lot more detail, in case you’re interested. Here are the three things I found most interesting:
Smart models mostly try to make sense out of nonsense
The newer models from Google and OpenAI refuse to accept that a random number is just a random number. They insist on finding a meaning, and then try to make that meaning work.
For example, I gave Gemini 763530653 and got a brass house number on a weathered wooden door. A UUID ended up embroidered on a hoodie sleeve or engraved on a clock, character-perfect, with hyphens included. OpenAI tried to be more clever by producing a clean spec sheet, or in one case a fully annotated diagram explaining the internal structure of the UUID it was given.
In order to tease out some more creativity, I tried asking Gemini to “let itself be inspired” by a number. It returned no image at all. Instead, it helpfully explained that 931360149 is a Unix timestamp for Wednesday, July 7, 1999. Another number I gave it was factored into primes. Both were correct, but both were also boring.
Google and OpenAI don’t publish how these models work inside, so I can only describe what I observed. To me, it looks like something in there tries to understand the prompt before any pixels get made. That’s a great feature when you want a precise image, but it’s also a real obstacle when you’re trying to provoke a happy accident. While working through the results, Claude suggested putting it this way: Stable Diffusion denoises pixels, while the newer models also denoise meaning.
Which brings up Stable Diffusion, one of the grandparents of today’s image generators. Its current version ignores the string completely: none of the images generated with it contained any text, and none related to the (random, nonsensical) input either. Instead, it produced serendipitous photographs of nothing in particular: a container ship, a group of workers in hard hats, a golden robotic bee in a snowy forest. Much closer to what I was hoping for!
Short numbers go on brass, long numbers go on screens
With nothing else to go on, Gemini revealed a clear house style: short numbers tended to go onto brass plates, tags, and keys, almost always on weathered wood in warm light. Claude and I ran seven samples to make sure this wasn’t a coincidence, and all seven looked like variations of the same theme.

Long random strings got a different treatment: they converged on glowing terminals. The string no longer looked like a label, so the model decided it must be code.
I find this oddly charming, because it’s not wrong. Where do short numbers appear in photos? On doors, lockers, and hotel keys. Where do long strings of gibberish appear? On screens. The model tried to find a home for these numbers that was consistent with its view of the world.
Asking it to be more creative didn’t change much. Even when I told it explicitly to use the number “as pure inspiration, not as a description,” it still wrote the digits onto something. The packaging may have changed, but the model’s (uninspired) goal remained the same: show the number.
However, there was one exception: Gemini split 186561909 into 1865 and 1909, decided that must be a date range, and built an entire genealogy office around it: a ledger, a pocket watch, a family portrait, and a calendar for September 1909 on the wall. We checked, and September 1909 really did start on a Wednesday. Still about the number, but this time there was a creative story behind it.
Sometimes a number breaks through
Every now and then, even the smart models let go. With Google’s Gemini, one 256-character string produced a serene mountain lake with a red canoe, without any reference to the input at all. OpenAI did the same more often, returning a puppy or an alpine village for a UUID, though its scenes looked more like stock photos than happy accidents.
My first thought was that the canoe must be hiding in the string somehow, maybe a token that looked like “boat.” So I ran the exact same string three more times. I got a street festival, a woman in a café, and the string written on a blackboard.
To me, these are the only truly serendipitous results of the whole experiment: images that have nothing to do with their input and that nobody, including the model, could have predicted. They’re rare, but they’re the lucky ones that made me press the button again.
Noise needs a partner who doesn’t explain it away
I love playing with image generators, and doing so can tell you a surprising amount about their embedded priors. However, if you’re after generating serendipity through randomness, today it seems to come down to these options:
- Noise fed into a smart model tends to get explained away, as a brass plate or a spec sheet.
- Good old diffusion models generate raw, unpredictable output, which is great for surprises but has no intention behind it.
- Curated randomness, like the constrained serendipity approach from the Serendipity Engine, sits in the sweet spot: random enough to surprise you, meaningful enough that the model has something to work with.
Brian Eno didn’t hand musicians random noise. He handed them Oblique Strategies: small, curated nudges with just enough meaning to push you somewhere new. Now that the smartest models are so good at making sense of things, I think that’s the kind of randomness that yields the best results.
If you want to try it yourself, the code and some further analysis are on GitHub. You can also feed it your own strings. I’d love to hear what you get, and what other approaches you try out to make a model dream!
