Character Randomizer
A fighting-game OC generator that respects its seed
- gender
- fighting_style
- nationality
- personality
- occupation
- special_power
- weapon
- clothing
- makeup
- accessories
Character Randomizer is the "draft" half of the AnotherUtils character pipeline. Give it a seed and it rolls ten attributes - gender, fighting style, nationality, personality, occupation, special power, weapon, clothing, makeup, accessories - from the same fixed pools its sibling Character Constructor understands. Ten string outputs pop out, and because the randomness is seeded, the same seed always rolls the same character. For a character-design batch where you want fresh fighters without hand-typing, that determinism is the whole appeal: reproducible variety on demand.
The pools are fighting-game canon, and honestly they're fun: ten martial arts from Judo to Krav Maga, ten nationalities, weapons ranging from "None" to "Ancient Relic Weapon", special powers like Ki Energy and Beast Transformation. It's the vocabulary of a late-90s arcade roster, and it covers the range well enough that rolling a few characters gives you very different fighters.
How it works
Under the hood it's one line you could write yourself: random.seed(seed), then random.choice() from each attribute list. The seed is an integer up to 2^64, matching the ranges you're used to from sampler seeds. No LLM, no API calls, no model - the "randomness" is Python's Mersenne Twister, fully deterministic given the seed. That's a feature: lock the seed, get the same character forever, and rerun the workflow to compare how a single character renders under different prompts or models.
The single input is seed (INT). The ten outputs are the attributes themselves, one per socket: gender, fighting_style, nationality, personality, occupation, special_power, weapon, clothing, makeup, accessories - all STRING.
The intended loop
The clean workflow is Randomizer → Constructor → CLIP Text Encode. Wire each of the ten outputs into the matching dropdown of Character Constructor (the sockets line up one-to-one), let it assemble the paragraph, and feed that to your sampler. The node also marks itself as an output node, so it can sit at the end of a graph and just display its picks - handy for a quick sanity check before you burn a generation.
Because everything is deterministic, you can also drive it from a List of Seeds workflow node and batch out a whole roster, one seed per character. Want a different lineup? Just change the seed.
Install
Part of the AnotherUtils pack - ComfyUI Manager (search AnotherUtils), or:
cd ComfyUI/custom_nodes
git clone https://github.com/marcoc2/ComfyUI-AnotherUtils.git
Restart ComfyUI. Zero dependencies, zero weights. This is as dependency-free as a custom node gets.
Common issues
The one trap is thematic rather than technical: the output vocabulary is fixed, so the node won't match whatever setting you're actually going for - a sci-fi or cyberpunk character will need hand-editing. And if you reuse the same seed across runs you'll get the same character every time, which surprises people who expected "random." Change the seed (or wire in a per-run seed generator) if you want a fresh roll. Beyond that there's nothing to break - it's ten random.choice() calls.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| seed | INT | 00–18446744073709550000 | — |
Outputs (10)
| Name | Type | Description |
|---|---|---|
| gender | STRING | — |
| fighting_style | STRING | — |
| nationality | STRING | — |
| personality | STRING | — |
| occupation | STRING | — |
| special_power | STRING | — |
| weapon | STRING | — |
| clothing | STRING | — |
| makeup | STRING | — |
| accessories | STRING | — |