According to FHS-3.0, /tmp is for temporary files and /run is for run-time variable data. Data in /run must be deleted at next boot, which is not required for /tmp, but still programs must not assume that the data in /tmp will be available at the next program start. All this seems quite similar to me.
So, what is the difference between the two? By which criterion should a program decide whether to put temporary data into /tmp or into /run?