File 1003-Use-rand-instead-of-the-obsolete-random-module.patch of Package erlang

From 80757f9491c72ee262a5910e0b3b02e95b1e5f2a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= <bjorn@erlang.org>
Date: Fri, 4 Dec 2015 12:15:40 +0100
Subject: [PATCH 02/15] Use 'rand' instead of the obsolete 'random' module

In most cases, we don't have to seed the random number generator,
as the rand:uniform/1 takes care about that itself.
---
 lib/asn1/src/asn1ct_value.erl            |  5 +----
 lib/asn1/test/testPrimStrings.erl        |  2 +-
 lib/common_test/src/ct_config.erl        |  3 +--
 lib/compiler/src/rec_env.erl             | 11 ++++++++++-
 lib/kernel/src/global.erl                | 20 +++++++-------------
 lib/mnesia/src/mnesia_lib.erl            | 15 +--------------
 lib/reltool/src/reltool_fgraph_win.erl   |  4 ++--
 lib/syntax_tools/src/erl_syntax_lib.erl  | 12 +++++++++---
 lib/test_server/src/test_server_ctrl.erl | 14 ++++++++++----
 lib/test_server/src/test_server_node.erl |  3 +--
 10 files changed, 43 insertions(+), 46 deletions(-)

diff --git a/lib/asn1/src/asn1ct_value.erl b/lib/asn1/src/asn1ct_value.erl
index 7f20d57..61a5661 100644
--- a/lib/asn1/src/asn1ct_value.erl
+++ b/lib/asn1/src/asn1ct_value.erl
@@ -353,10 +353,7 @@ random_unnamed_bit_string(M, C) ->
 %%     end.
 
 random(Upper) ->
-    _ = random:seed(erlang:phash2([erlang:node()]),
-		    erlang:monotonic_time(),
-		    erlang:unique_integer()),
-    random:uniform(Upper).
+    rand:uniform(Upper).
 
 size_random(C) ->
     case get_constraint(C,'SizeConstraint') of
diff --git a/lib/asn1/test/testPrimStrings.erl b/lib/asn1/test/testPrimStrings.erl
index 46793c6..c9217d6 100644
--- a/lib/asn1/test/testPrimStrings.erl
+++ b/lib/asn1/test/testPrimStrings.erl
@@ -54,7 +54,7 @@ fragmented_strings(Len, Types) ->
     ok.
 
 make_ns_value(0) -> [];
-make_ns_value(N) -> [($0 - 1) + random:uniform(10)|make_ns_value(N-1)].
+make_ns_value(N) -> [($0 - 1) + rand:uniform(10)|make_ns_value(N-1)].
 
 fragmented_lengths() ->
     K16 = 1 bsl 14,
diff --git a/lib/common_test/src/ct_config.erl b/lib/common_test/src/ct_config.erl
index 251204a..33efe7a 100644
--- a/lib/common_test/src/ct_config.erl
+++ b/lib/common_test/src/ct_config.erl
@@ -694,11 +694,10 @@ make_crypto_key(String) ->
     {[K1,K2,K3],IVec}.
 
 random_bytes(N) ->
-    random:seed(os:timestamp()),
     random_bytes_1(N, []).
 
 random_bytes_1(0, Acc) -> Acc;
-random_bytes_1(N, Acc) -> random_bytes_1(N-1, [random:uniform(255)|Acc]).
+random_bytes_1(N, Acc) -> random_bytes_1(N-1, [rand:uniform(255)|Acc]).
 
 check_callback_load(Callback) ->
     case code:is_loaded(Callback) of
diff --git a/lib/compiler/src/rec_env.erl b/lib/compiler/src/rec_env.erl
index 0e9e12d..5a4a870 100644
--- a/lib/compiler/src/rec_env.erl
+++ b/lib/compiler/src/rec_env.erl
@@ -598,7 +598,16 @@ start_range(Env) ->
 %% (pseudo-)randomly distributed over the range.
 
 generate(_N, Range) ->
-    random:uniform(Range).    % works well
+    %% We must use the same sequence of random variables to ensure
+    %% that two compilations of the same source code generates the
+    %% same BEAM code.
+    case rand:export_seed() of
+	undefined ->
+	    rand:seed(exsplus, {1,42,2053});
+	_ ->
+	    ok
+    end,
+    rand:uniform(Range).			% works well
 
 
 %% =====================================================================
diff --git a/lib/kernel/src/global.erl b/lib/kernel/src/global.erl
index dcabeb5..0c73ead 100644
--- a/lib/kernel/src/global.erl
+++ b/lib/kernel/src/global.erl
@@ -2068,23 +2068,17 @@ get_known() ->
     gen_server:call(global_name_server, get_known, infinity).
 
 random_sleep(Times) ->
-    case (Times rem 10) of
-	0 -> erase(random_seed);
-	_ -> ok
-    end,
-    case get(random_seed) of
-	undefined ->
-	    _ = random:seed(erlang:phash2([erlang:node()]),
-			    erlang:monotonic_time(),
-			    erlang:unique_integer()),
-	    ok;
-	_ -> ok
-    end,
+    _ = case Times rem 10 of
+	    0 ->
+		_ = rand:seed(exsplus);
+	    _ ->
+		ok
+	end,
     %% First time 1/4 seconds, then doubling each time up to 8 seconds max.
     Tmax = if Times > 5 -> 8000;
 	      true -> ((1 bsl Times) * 1000) div 8
 	   end,
-    T = random:uniform(Tmax),
+    T = rand:uniform(Tmax),
     ?trace({random_sleep, {me,self()}, {times,Times}, {t,T}, {tmax,Tmax}}),
     receive after T -> ok end.
 
diff --git a/lib/mnesia/src/mnesia_lib.erl b/lib/mnesia/src/mnesia_lib.erl
index 77c7a76..4e761d2 100644
--- a/lib/mnesia/src/mnesia_lib.erl
+++ b/lib/mnesia/src/mnesia_lib.erl
@@ -921,20 +921,7 @@ random_time(Retries, _Counter0) ->
     UpperLimit = 500,
     Dup = Retries * Retries,
     MaxIntv = trunc(UpperLimit * (1-(50/((Dup)+50)))),
-    
-    case get(random_seed) of
-	undefined ->
-	    _ = random:seed(erlang:unique_integer(),
-			    erlang:monotonic_time(),
-			    erlang:unique_integer()),
-	    Time = Dup + random:uniform(MaxIntv),
-	    %%	    dbg_out("---random_test rs ~w max ~w val ~w---~n", [Retries, MaxIntv, Time]),
-	    Time;
-	_ ->
-	    Time = Dup + random:uniform(MaxIntv),
-	    %%	    dbg_out("---random_test rs ~w max ~w val ~w---~n", [Retries, MaxIntv, Time]),
-	    Time	    
-    end.
+    Dup + rand:uniform(MaxIntv).
 
 report_system_event(Event0) ->
     Event = {mnesia_system_event, Event0},
diff --git a/lib/reltool/src/reltool_fgraph_win.erl b/lib/reltool/src/reltool_fgraph_win.erl
index 6b58cae..deab502 100644
--- a/lib/reltool/src/reltool_fgraph_win.erl
+++ b/lib/reltool/src/reltool_fgraph_win.erl
@@ -220,8 +220,8 @@ graph_add_node_unsure(Key, State, G = #graph{ vs = Vs }) ->
 graph_add_node(Key, Color, G = #graph{ vs = Vs}) ->
     Q  = 20.0,   % repulsive force
     M  = 0.5,    % mass
-    P  = {float(450 + random:uniform(100)),
-	  float(450 + random:uniform(100))},
+    P  = {float(450 + rand:uniform(100)),
+	  float(450 + rand:uniform(100))},
     G#graph{ vs = reltool_fgraph:add(Key,
 				     #fg_v{ p = P, m = M, q = Q, color = Color},
 				     Vs)}.
diff --git a/lib/syntax_tools/src/erl_syntax_lib.erl b/lib/syntax_tools/src/erl_syntax_lib.erl
index 5b5b18d..58c4cc5 100644
--- a/lib/syntax_tools/src/erl_syntax_lib.erl
+++ b/lib/syntax_tools/src/erl_syntax_lib.erl
@@ -359,9 +359,9 @@ new_variable_name(S) ->
 %% within a reasonably small range relative to the number of elements in
 %% the set.
 %%
-%% This function uses the module `random' to generate new
+%% This function uses the module `rand' to generate new
 %% keys. The seed it uses may be initialized by calling
-%% `random:seed/0' or `random:seed/3' before this
+%% `rand:seed/1' or `rand:seed/2' before this
 %% function is first called.
 %%
 %% @see new_variable_name/1
@@ -404,7 +404,13 @@ start_range(S) ->
 %% order, but (pseudo-)randomly distributed over the range.
 
 generate(_Key, Range) ->
-    random:uniform(Range).    % works well
+    _ = case rand:export_seed() of
+	    undefined ->
+		rand:seed(exsplus, {753,8,73});
+	    _ ->
+		ok
+	end,
+    rand:uniform(Range).			% works well
 
 
 %% =====================================================================
diff --git a/lib/test_server/src/test_server_ctrl.erl b/lib/test_server/src/test_server_ctrl.erl
index 0be6e0b..3468187 100644
--- a/lib/test_server/src/test_server_ctrl.erl
+++ b/lib/test_server/src/test_server_ctrl.erl
@@ -3163,11 +3163,17 @@ delete_prop([], Props) ->
 %% Shuffles the order of Cases.
 
 shuffle_cases(Ref, Cases, undefined) ->
-    shuffle_cases(Ref, Cases, ?now);
+    shuffle_cases(Ref, Cases, rand:seed_s(exsplus));
 
-shuffle_cases(Ref, [{conf,Ref,_,_}=Start | Cases], Seed) ->
+shuffle_cases(Ref, [{conf,Ref,_,_}=Start | Cases], Seed0) ->
     {N,CasesToShuffle,Rest} = cases_to_shuffle(Ref, Cases),
-    ShuffledCases = random_order(N, random:uniform_s(N, Seed), CasesToShuffle, []),
+    Seed = case Seed0 of
+	       {X,Y,Z} when is_integer(X+Y+Z) ->
+		   rand:seed(exsplus, Seed0);
+	       _ ->
+		   Seed0
+	   end,
+    ShuffledCases = random_order(N, rand:uniform_s(N, Seed), CasesToShuffle, []),
     [Start|ShuffledCases] ++ Rest.
 
 cases_to_shuffle(Ref, Cases) ->
@@ -3201,7 +3207,7 @@ random_order(1, {_Pos,Seed}, [{_Ix,CaseOrGroup}], Shuffled) ->
     Shuffled++CaseOrGroup;
 random_order(N, {Pos,NewSeed}, IxCases, Shuffled) ->
     {First,[{_Ix,CaseOrGroup}|Rest]} = lists:split(Pos-1, IxCases),
-    random_order(N-1, random:uniform_s(N-1, NewSeed),
+    random_order(N-1, rand:uniform_s(N-1, NewSeed),
 		 First++Rest, Shuffled++CaseOrGroup).
 
 
diff --git a/lib/test_server/src/test_server_node.erl b/lib/test_server/src/test_server_node.erl
index 4e6839f..3419f3f 100644
--- a/lib/test_server/src/test_server_node.erl
+++ b/lib/test_server/src/test_server_node.erl
@@ -619,8 +619,7 @@ do_quote_progname([Prog,Arg|Args]) ->
     end.
 
 random_element(L) ->
-    random:seed(os:timestamp()),
-    lists:nth(random:uniform(length(L)), L).
+    lists:nth(rand:uniform(length(L)), L).
 
 find_release(latest) ->
     "/usr/local/otp/releases/latest/bin/erl";
-- 
2.1.4

openSUSE Build Service is sponsored by