1 //===----------------------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 // <random>
11 
12 // template <class UIntType, UIntType a, UIntType c, UIntType m>
13 //   class linear_congruential_engine;
14 
15 // void discard(unsigned long long z);
16 
17 #include <random>
18 #include <cassert>
19 
20 template <class T>
21 void
rand0()22 rand0()
23 {
24     typedef std::linear_congruential_engine<T, 16807, 0, 2147483647> E;
25     E e;
26     e.discard(9999);
27     assert(e() == 1043618065);
28 }
29 
30 template <class T>
31 void
rand()32 rand()
33 {
34     typedef std::linear_congruential_engine<T, 48271, 0, 2147483647> E;
35     E e;
36     e.discard(9999);
37     assert(e() == 399268537);
38 }
39 
40 template <class T>
41 void
other()42 other()
43 {
44     typedef std::linear_congruential_engine<T, 48271, 123465789, 2147483647> E;
45     E e1;
46     E e2;
47     assert(e1 == e2);
48     e1.discard(1);
49     assert(e1 != e2);
50     e2();
51     assert(e1 == e2);
52     e1.discard(3);
53     assert(e1 != e2);
54     e2();
55     e2();
56     e2();
57     assert(e1 == e2);
58 }
59 
main()60 int main()
61 {
62     rand0<unsigned int>();
63     rand0<unsigned long>();
64     rand0<unsigned long long>();
65 
66     rand<unsigned int>();
67     rand<unsigned long>();
68     rand<unsigned long long>();
69 
70     other<unsigned int>();
71     other<unsigned long>();
72     other<unsigned long long>();
73 }
74