Boredom's a terrible thing but the website Dinosaur Comics is not. So when, in the midst of holiday boredom I stumbled across this comic I decided have a go at implementing it.
I don't often get to use PHP so I decided it'd be a good excercise for me to use the language. There's a few implementations of this online but mine's the only one I've seen which handles the "[goto panel two and play recursively] / [choose any ol' noun from the dictionary]" block.
You can see it in action here.
<?php
function RandomBool()
{
    return 0.01 * rand(0, 100) >= 0.5;
}
function RandomLine($filename)
{
    $lines = file($filename);
    return $lines[array_rand($lines)];
}
function GetPrefix($noun)
{
    $vowels = array("a", "e", "i", "o", "u");
    if(in_array(strtolower($noun[0]), $vowels))
    {
        return "an";
    }
    else
    {
        return "a";
    }
}
function RandomNoun()
{
    return trim(RandomLine("../protected/data/nouns.txt"));
}
function RandomFromArray($array)
{
    $key = array_rand($array);
    return $array[$key];
}
function CharacterType($index)
{
    $adjectives = array(
        array("meat", "robot", "urban", "silver", "animal",
            "sex", "fruit", "adult", "child", "famed",
            "licensed", "problem"),
        array("meaty", "famous", "infamous", "wide-eyed",
            "sullen", "attractive", "competing", "powerful",
            "space", "hairy", "social"));
    $nouns = array(
        array("stylist", "engineer", "astronaut", "ecologist",
            "planner", "model", "smith", "dancer", "producer",
            "lawyer", "loner", "priest", "criminal", "prodigy",
            "terrorist", "dinosaur", "clone", "athelete",
            "head of state"),
        array("teen", "doctor", "ghost", "artist", "surgeon",
            "corsetièr", "superhero", "cartoonist",
            "spouse", "dog", "religion",
            "medical health professional", "senior", "telepath",
            "jerk", "family"));
    $adj = RandomFromArray($adjectives[$index]);
    $noun = RandomFromArray($nouns[$index]);
    $prefix = GetPrefix($adj);
    return $prefix . " " . $adj . " " . $noun;
}
function BuildCharacter()
{
    $verbs = array("create", "destroy", "get over", "bewitch",
        "unmask", "sex up", "steal", "hug", "give birth to",
        "team up with", "profit from");
    $result = CharacterType(0);
    $result = $result . " who wants to " . RandomFromArray($verbs) .
        " " . CharacterType(1);
    $result = $result . " but is blocked in this desire by ";
    if (RandomBool())
    {
        $result = $result . BuildCharacter();
    }
    else
    {
        $noun = RandomNoun();
        $prefix = GetPrefix($noun);
        $result = $result . $prefix . " " . $noun . ".";
    }
    return $result;
}
echo BuildCharacter();
?>