From 935ec36fdd9f1ebdb32baf7c1d94ac4e390d26c6 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Mon, 5 Nov 2012 19:25:20 +0000 Subject: [PATCH] re PR libstdc++/55215 (Constructor seeding is broken for Mersenne twister) 2012-11-05 Paolo Carlini PR libstdc++/55215 * include/bits/random.tcc (mersenne_twister_engine<>::seed(_Sseq&)): Assign state_size to _M_p. * testsuite/26_numerics/random/mersenne_twister_engine/cons/55215.cc: New. * testsuite/26_numerics/random/independent_bits_engine/cons/55215.cc: Likewise. * testsuite/26_numerics/random/shuffle_order_engine/cons/55215.cc: Likewise. * testsuite/26_numerics/random/subtract_with_carry_engine/cons/ 55215.cc: Likewise. * testsuite/26_numerics/random/discard_block_engine/cons/55215.cc: Likewise. * testsuite/26_numerics/random/linear_congruential_engine/cons/ 55215.cc: Likewise. From-SVN: r193181 --- libstdc++-v3/ChangeLog | 22 ++++++-- libstdc++-v3/include/bits/random.tcc | 1 + .../random/discard_block_engine/cons/55215.cc | 58 +++++++++++++++++++++ .../random/independent_bits_engine/cons/55215.cc | 60 ++++++++++++++++++++++ .../linear_congruential_engine/cons/55215.cc | 58 +++++++++++++++++++++ .../random/mersenne_twister_engine/cons/55215.cc | 58 +++++++++++++++++++++ .../random/shuffle_order_engine/cons/55215.cc | 58 +++++++++++++++++++++ .../subtract_with_carry_engine/cons/55215.cc | 58 +++++++++++++++++++++ 8 files changed, 370 insertions(+), 3 deletions(-) create mode 100644 libstdc++-v3/testsuite/26_numerics/random/discard_block_engine/cons/55215.cc create mode 100644 libstdc++-v3/testsuite/26_numerics/random/independent_bits_engine/cons/55215.cc create mode 100644 libstdc++-v3/testsuite/26_numerics/random/linear_congruential_engine/cons/55215.cc create mode 100644 libstdc++-v3/testsuite/26_numerics/random/mersenne_twister_engine/cons/55215.cc create mode 100644 libstdc++-v3/testsuite/26_numerics/random/shuffle_order_engine/cons/55215.cc create mode 100644 libstdc++-v3/testsuite/26_numerics/random/subtract_with_carry_engine/cons/55215.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 2f02107..749648a 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,21 @@ +2012-11-05 Paolo Carlini + + PR libstdc++/55215 + * include/bits/random.tcc (mersenne_twister_engine<>::seed(_Sseq&)): + Assign state_size to _M_p. + * testsuite/26_numerics/random/mersenne_twister_engine/cons/55215.cc: + New. + * testsuite/26_numerics/random/independent_bits_engine/cons/55215.cc: + Likewise. + * testsuite/26_numerics/random/shuffle_order_engine/cons/55215.cc: + Likewise. + * testsuite/26_numerics/random/subtract_with_carry_engine/cons/ + 55215.cc: Likewise. + * testsuite/26_numerics/random/discard_block_engine/cons/55215.cc: + Likewise. + * testsuite/26_numerics/random/linear_congruential_engine/cons/ + 55215.cc: Likewise. + 2012-11-03 Florian Weimer * libsupc++/vec.cc (compute_size): New. @@ -23,14 +41,12 @@ * doc/xml/manual/prerequisites.xml: Remove detailed reference to binutils downloads. - - 2012-11-02 Paolo Carlini PR libstdc++/55169 * include/bits/random.h: Remove all uses of param(). (chi_squared_distribution<>::__generate_impl(_ForwardIterator, - _ForwardIterator, _UniformRandomNumberGenerator&): Declare + _ForwardIterator, _UniformRandomNumberGenerator&)): Declare * include/bits/random.tcc: ... define. * include/ext/random: Remove all uses of param(). diff --git a/libstdc++-v3/include/bits/random.tcc b/libstdc++-v3/include/bits/random.tcc index 0f44ee8..54a0c22 100644 --- a/libstdc++-v3/include/bits/random.tcc +++ b/libstdc++-v3/include/bits/random.tcc @@ -385,6 +385,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } if (__zero) _M_x[0] = __detail::_Shift<_UIntType, __w - 1>::__value; + _M_p = state_size; } template. + +#include +#include + +int f(int x) +{ + std::seed_seq sq(&x, &x + 1); + auto rnd = std::ranlux24(sq); + return std::uniform_int_distribution()(rnd); +} + +int g(int x) +{ + std::seed_seq sq(&x, &x + 1); + auto rnd = std::ranlux24(); + rnd.seed(sq); + return std::uniform_int_distribution()(rnd); +} + +void test01() +{ + bool test __attribute__((unused)) = true; + + const int f1 = f(0); + const int f2 = f(0); + + const int g1 = g(0); + const int g2 = g(0); + + VERIFY( f1 == f2 ); + VERIFY( g1 == g2 ); + VERIFY( f1 == g1 ); +} + +int main() +{ + test01(); + return 0; +} diff --git a/libstdc++-v3/testsuite/26_numerics/random/independent_bits_engine/cons/55215.cc b/libstdc++-v3/testsuite/26_numerics/random/independent_bits_engine/cons/55215.cc new file mode 100644 index 0000000..4b502b7 --- /dev/null +++ b/libstdc++-v3/testsuite/26_numerics/random/independent_bits_engine/cons/55215.cc @@ -0,0 +1,60 @@ +// { dg-options "-std=gnu++11" } +// { dg-require-cstdint "" } +// +// Copyright (C) 2012 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +#include +#include + +int f(int x) +{ + std::seed_seq sq(&x, &x + 1); + auto rnd = std::independent_bits_engine(sq); + return std::uniform_int_distribution()(rnd); +} + +int g(int x) +{ + std::seed_seq sq(&x, &x + 1); + auto rnd = std::independent_bits_engine(); + rnd.seed(sq); + return std::uniform_int_distribution()(rnd); +} + +void test01() +{ + bool test __attribute__((unused)) = true; + + const int f1 = f(0); + const int f2 = f(0); + + const int g1 = g(0); + const int g2 = g(0); + + VERIFY( f1 == f2 ); + VERIFY( g1 == g2 ); + VERIFY( f1 == g1 ); +} + +int main() +{ + test01(); + return 0; +} diff --git a/libstdc++-v3/testsuite/26_numerics/random/linear_congruential_engine/cons/55215.cc b/libstdc++-v3/testsuite/26_numerics/random/linear_congruential_engine/cons/55215.cc new file mode 100644 index 0000000..21333fb --- /dev/null +++ b/libstdc++-v3/testsuite/26_numerics/random/linear_congruential_engine/cons/55215.cc @@ -0,0 +1,58 @@ +// { dg-options "-std=gnu++11" } +// { dg-require-cstdint "" } +// +// Copyright (C) 2012 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +#include +#include + +int f(int x) +{ + std::seed_seq sq(&x, &x + 1); + auto rnd = std::minstd_rand(sq); + return std::uniform_int_distribution()(rnd); +} + +int g(int x) +{ + std::seed_seq sq(&x, &x + 1); + auto rnd = std::minstd_rand(); + rnd.seed(sq); + return std::uniform_int_distribution()(rnd); +} + +void test01() +{ + bool test __attribute__((unused)) = true; + + const int f1 = f(0); + const int f2 = f(0); + + const int g1 = g(0); + const int g2 = g(0); + + VERIFY( f1 == f2 ); + VERIFY( g1 == g2 ); + VERIFY( f1 == g1 ); +} + +int main() +{ + test01(); + return 0; +} diff --git a/libstdc++-v3/testsuite/26_numerics/random/mersenne_twister_engine/cons/55215.cc b/libstdc++-v3/testsuite/26_numerics/random/mersenne_twister_engine/cons/55215.cc new file mode 100644 index 0000000..3453d9f --- /dev/null +++ b/libstdc++-v3/testsuite/26_numerics/random/mersenne_twister_engine/cons/55215.cc @@ -0,0 +1,58 @@ +// { dg-options "-std=gnu++11" } +// { dg-require-cstdint "" } +// +// Copyright (C) 2012 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +#include +#include + +int f(int x) +{ + std::seed_seq sq(&x, &x + 1); + auto rnd = std::mt19937(sq); + return std::uniform_int_distribution()(rnd); +} + +int g(int x) +{ + std::seed_seq sq(&x, &x + 1); + auto rnd = std::mt19937(); + rnd.seed(sq); + return std::uniform_int_distribution()(rnd); +} + +void test01() +{ + bool test __attribute__((unused)) = true; + + const int f1 = f(0); + const int f2 = f(0); + + const int g1 = g(0); + const int g2 = g(0); + + VERIFY( f1 == f2 ); + VERIFY( g1 == g2 ); + VERIFY( f1 == g1 ); +} + +int main() +{ + test01(); + return 0; +} diff --git a/libstdc++-v3/testsuite/26_numerics/random/shuffle_order_engine/cons/55215.cc b/libstdc++-v3/testsuite/26_numerics/random/shuffle_order_engine/cons/55215.cc new file mode 100644 index 0000000..d7db635 --- /dev/null +++ b/libstdc++-v3/testsuite/26_numerics/random/shuffle_order_engine/cons/55215.cc @@ -0,0 +1,58 @@ +// { dg-options "-std=gnu++11" } +// { dg-require-cstdint "" } +// +// Copyright (C) 2012 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +#include +#include + +int f(int x) +{ + std::seed_seq sq(&x, &x + 1); + auto rnd = std::knuth_b(sq); + return std::uniform_int_distribution()(rnd); +} + +int g(int x) +{ + std::seed_seq sq(&x, &x + 1); + auto rnd = std::knuth_b(); + rnd.seed(sq); + return std::uniform_int_distribution()(rnd); +} + +void test01() +{ + bool test __attribute__((unused)) = true; + + const int f1 = f(0); + const int f2 = f(0); + + const int g1 = g(0); + const int g2 = g(0); + + VERIFY( f1 == f2 ); + VERIFY( g1 == g2 ); + VERIFY( f1 == g1 ); +} + +int main() +{ + test01(); + return 0; +} diff --git a/libstdc++-v3/testsuite/26_numerics/random/subtract_with_carry_engine/cons/55215.cc b/libstdc++-v3/testsuite/26_numerics/random/subtract_with_carry_engine/cons/55215.cc new file mode 100644 index 0000000..4927d77 --- /dev/null +++ b/libstdc++-v3/testsuite/26_numerics/random/subtract_with_carry_engine/cons/55215.cc @@ -0,0 +1,58 @@ +// { dg-options "-std=gnu++11" } +// { dg-require-cstdint "" } +// +// Copyright (C) 2012 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +#include +#include + +int f(int x) +{ + std::seed_seq sq(&x, &x + 1); + auto rnd = std::ranlux24_base(sq); + return std::uniform_int_distribution()(rnd); +} + +int g(int x) +{ + std::seed_seq sq(&x, &x + 1); + auto rnd = std::ranlux24_base(); + rnd.seed(sq); + return std::uniform_int_distribution()(rnd); +} + +void test01() +{ + bool test __attribute__((unused)) = true; + + const int f1 = f(0); + const int f2 = f(0); + + const int g1 = g(0); + const int g2 = g(0); + + VERIFY( f1 == f2 ); + VERIFY( g1 == g2 ); + VERIFY( f1 == g1 ); +} + +int main() +{ + test01(); + return 0; +} -- 2.7.4