#Java 8, <s>420</s> <s>418</s> <s>402</s> <s>373</s> <s>359</s> 357 bytes
<!-- language-all: lang-java -->
import java.util.*;s->f(s,new Stack())void f(String s,Stack<Integer>S){for(int i=0,c,t,u;i++<s.length();){if((c=s.charAt(i-1))<42)if(S.peek()!=0)if(c<41)f(s.substring(i),S);else f(s,S);if(c==46)System.out.println(S.peek());if(c>57)S.add(c>99?new Random().nextInt():S.peek());if(c<44|c==45|c==47){t=S.pop();u=S.pop();S.add(c<43?u*t:c<45?u+t:c<46?u-t:u/t);}}}
-2 bytes thanks to *@Grimy*.
[Try it online.](https://tio.run/##7Vffb9owEH7nr7jxZDfEwAatmhDQHvbQh3XSMu1l2oMxBtyGOLLP7Sqa/evMCfSXSrWtQl07NQ/O2Xf33X0@hL6c8DMenkxOV2pRaINw4vfMocrYXgzQbkPQPQTUgHMJ4wuUodAux4bIuLXwkat82QBQOUoz5ULCcbUFONNqAoKkaFQ@A0tjf1o2/HIMOSSwsuFwSmwrl@eQIhenhNK4zple57Rqx@DIQ8@kGaZ0OdWG@Eqgkk5LtLDlYhUEA8symc9wTmhMl2pKiEgsE3Nu3iNRYZfSQe8t9ecpK6T0hd4knWorBr0u9T0w68a2LkkUbaU0lpmVUDXn7SouSXr7NL2wKBdMO2SFj8Usv8ZbRw37BzRlfDLx5uHhqCL2mecTvSCU5fIHehqERndzBr3eZQXfr9cDusTEB@jCM3HX1gZ00Hs3cnsYeaM/ckFt7I9ciJFrI43Lslz52y3cOFMCLHL0r/pCF35Emzv99h04Xc8HpUXS/Bm1ox09wY4etsOenqTh58HmKUm9cnvp9B7BcNfYz3AC/2gSr7@5/22cr/@ML4PTH3H5S5Rb581a9d5orTBq3zuqkgNG6pXe995x1Pr5trSr4zZyWeWFw4242yJWm0eVH77qzKdnEgqjZ4YvIriquSVnDfmg@2FP85NDn3oDjuZi3RlAJYyrr4ZKFjNxp0YJgqOYky9zo8/52Hcp6VXatiofjNEGtBDOGDnx1QJ5hfSInsMmM7KQHEm/Q3/DumyUq18)
**Explanation:**
import java.util.*; // Required import for 2x Stack and Random
s-> // Method with String parameter and no return-type
f(s,new Stack()) // Call the recursive function, with a new Stack
// Separated recursive method with String and Stack parameters
void f(String s,Stack<Integer>S){
int i=0, // Index integer
c, // Temp integer used for the current character
t,u; // Temp integers used for the peeked/popped top of the stack
for(;i++<s.length();){ // Loop `i` in the range [0, String-length):
if((c=s.charAt(i-1)) // Set `c` to the current character
<42) // If the character is either '(' or ')':
if(S.peek()!=0) // If the top of the stack is not 0:
if(c<41) // If the current character is '(':
f(s.substring(i),// Remove everything before and including the "(" in the String
S); // And do a recursive call with this trailing part
else // Else (the character is ')')
f(s,S); // Do a recursive call as is
if(c==46) // If the character is '.'
System.out.println( // Print with trailing newline:
S.peek()); // The peeked top of the stack
if(c>57) // If the character is ':' or '~':
S.add(c>99? // If the character is '~':
new Random().nextInt()
// Add a random integer from the range [0,2147483647) to the stack
: // Else (the character is ':')
S.peek()); // Add the peeked top to the stack
if(c<44|c==45|c==47) // If the character is '*', '+', '-', or '/':
t=S.pop();u=S.pop();// Pop and set the top two values to `t` and `u`
S.add(c<43? // If the character is '*':
u*t // Add the product of the two values to the stack
:c<44? // Else-if the character is '+':
u+t // Add the sum of the two values to the stack
:c<46? // Else-if the character is '-':
u-t // Subtract the top two values, and add it to the stack
: // Else (the character is '/'):
u/t;}}} // Divide the top two values, and add it to the stack