## Python, 107 bytes

<!-- language: lang-py -->

    from random import*
    lambda s:''.join([choice(c+c.swapcase()),'_'][c<'!']for c in sorted(s,key=str.isdigit))

An improvement on the [other](http://codegolf.stackexchange.com/a/76550/21487) [two](http://codegolf.stackexchange.com/a/76501/21487) Python answers because:

* `[...,'_'][c<'!']` is used instead of `s.replace(' ','_')`, and
* `choice(c+c.swapcase())` is used instead of `choice([c.upper(),c.lower()])`