}
}
if (dev_urandom_state != OK)
- // Reading /dev/urandom doesn't work, fall back to time().
#endif
- *x = vim_time();
+ {
+ // Reading /dev/urandom doesn't work, fall back to:
+ // - randombytes_random()
+ // - reltime() or time()
+ // - XOR with process ID
+#if defined(FEAT_SODIUM)
+ if (sodium_init() >= 0)
+ *x = randombytes_random();
+ else
+#endif
+ {
+#if defined(FEAT_RELTIME)
+ proftime_T res;
+ profile_start(&res);
+# if defined(MSWIN)
+ *x = (UINT32_T)res.LowPart;
+# else
+ *x = (UINT32_T)res.tv_usec;
+# endif
+#else
+ *x = vim_time();
+#endif
+ *x ^= mch_get_pid();
+ }
+ }
}
#define ROTL(x, k) (((x) << (k)) | ((x) >> (32 - (k))))
" Tests for srand() and rand()
+source check.vim
+source shared.vim
+
func Test_Rand()
let r = srand(123456789)
call assert_equal([1573771921, 319883699, 2742014374, 1324369493], r)
call rand()
endfunc
+func Test_srand()
+ CheckNotGui
+
+ let cmd = GetVimCommand() .. ' -V -es -c "echo rand()" -c qa!'
+ let bad = 0
+ for _ in range(10)
+ echo cmd
+ let result1 = system(cmd)
+ let result2 = system(cmd)
+ if result1 ==# result2
+ let bad += 1
+ endif
+ endfor
+ call assert_inrange(0, 4, bad)
+endfunc
+
" vim: shiftwidth=2 sts=2 expandtab