Ly, 44 bytes
irysp>l[0f1f,,]p<[>sprl0y?[,sprl]psp<l' *-o]
Try it online!
This one works by generating a list of 0 1
pairs on a list the size of the input string. Then for each input character it reverses the list of 0 1
pairs a random number of times, then pops the top off the resulting stack. That value is used to decide whether or not to capitalize the character before printing it out.
- Prep the input strings
ir - read input codepoints into the stack, reverse the stack
ysp - save the number of char, delete that from the stack
> - switch to an empty stack
- Generate a list of
0 1
pairs
l[0f1f,,]p
l[ ,,]p - loop "n/2" times adding "0,1" pairs to the stack
0f - add a "0" to the stack, pull the iterating var forward
1f - add a "1" to the stack and pull the iterator forward again
- Process each of the input chars on the input stack
<[ ] - loop until the input stack is empty
*3.1* - get a random 0/1 from the boolean stack
<l - back to input stack, load boolean 0/1 capitalization choice
' * - multiple " " by the boolean
- - subtract to capitalize (of boolean was true)
o - print the current input char
3.1 Pull a random boolean off the list
> - switch to the boolean stack
sprl - disrupt pattern on list, move top entry to the bottom
0y? - pick a random number between 0 and the stack size
[,sp l]p - loop that number of time, using backup cell for iterator val
r - reverse the stack
sp - save the random boolean to the backup cell