random: fix rounding in barand()
This fixes #85. * src/misc/random.hh (barand): Use round() before casting. * doc/org/oaut.org: Recompute example. * src/tests/randaut.test, wrap/python/tests/randaut.ipynb: Adjust.
This commit is contained in:
parent
eabed370bf
commit
a75a9c091c
4 changed files with 2073 additions and 1800 deletions
|
|
@ -23,6 +23,7 @@
|
|||
#pragma once
|
||||
|
||||
#include "common.hh"
|
||||
#include <cassert>
|
||||
#include <cmath>
|
||||
#include <vector>
|
||||
|
||||
|
|
@ -72,7 +73,7 @@ namespace spot
|
|||
|
||||
/// \brief Compute pseudo-random integer value between 0
|
||||
/// and \a n included, following a binomial distribution
|
||||
/// for probability \a p.
|
||||
/// with probability \a p.
|
||||
///
|
||||
/// \a gen must be a random function computing a pseudo-random
|
||||
/// double value following a standard normal distribution.
|
||||
|
|
@ -93,18 +94,16 @@ namespace spot
|
|||
int
|
||||
rand() const
|
||||
{
|
||||
int res;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
double x = gen() * s_ + m_;
|
||||
if (x < 0.0)
|
||||
int x = round(gen() * s_ + m_);
|
||||
if (x < 0)
|
||||
continue;
|
||||
res = static_cast<int> (x);
|
||||
if (res <= n_)
|
||||
break;
|
||||
if (x <= n_)
|
||||
return x;
|
||||
}
|
||||
return res;
|
||||
SPOT_UNREACHABLE();
|
||||
return 0;
|
||||
}
|
||||
protected:
|
||||
const int n_;
|
||||
|
|
|
|||
|
|
@ -59,10 +59,10 @@ test `expr $a + $b` = 100
|
|||
$randaut -n 5 --name='%F-%L-%s-%c-%e' -H a | grep '^name' >out
|
||||
cat >expected<<EOF
|
||||
name: "0-0-10-1-30"
|
||||
name: "0-1-10-4-27"
|
||||
name: "0-2-10-6-20"
|
||||
name: "0-3-10-1-25"
|
||||
name: "0-4-10-2-20"
|
||||
name: "0-1-10-1-29"
|
||||
name: "0-2-10-3-22"
|
||||
name: "0-3-10-1-30"
|
||||
name: "0-4-10-1-27"
|
||||
EOF
|
||||
diff out expected
|
||||
|
||||
|
|
@ -97,19 +97,19 @@ $a: 4 Inf(0)&Inf(1)&Inf(2)&Inf(3)
|
|||
acc-name: generalized-Buchi 4
|
||||
$a: 4 Inf(0)&Inf(1)&Inf(2)&Inf(3)
|
||||
$a: 4 Fin(1) | (Fin(2) & Fin(3) & Fin(0))
|
||||
$a: 4 Inf(2) | ((Inf(0) | Inf(1)) & Fin(3))
|
||||
$a: 4 (Fin(0) & Fin(3)) | (Fin(2) & Inf(1))
|
||||
acc-name: parity min even 4
|
||||
$a: 4 Inf(0) | (Fin(1) & (Inf(2) | Fin(3)))
|
||||
acc-name: parity max odd 3
|
||||
$a: 3 Fin(2) & (Inf(1) | Fin(0))
|
||||
acc-name: parity max even 3
|
||||
$a: 3 Inf(2) | (Fin(1) & Inf(0))
|
||||
acc-name: parity max even 2
|
||||
$a: 2 Fin(1) & Inf(0)
|
||||
acc-name: parity max odd 4
|
||||
$a: 4 Inf(3) | (Fin(2) & (Inf(1) | Fin(0)))
|
||||
acc-name: generalized-Rabin 3 2 3 0
|
||||
$a: 8 (Fin(0) & (Inf(1)&Inf(2))) | (Fin(3) & (Inf(4)&Inf(5)&Inf(6))) | Fin(7)
|
||||
acc-name: generalized-Rabin 3 2 2 0
|
||||
$a: 7 (Fin(0) & (Inf(1)&Inf(2))) | (Fin(3) & (Inf(4)&Inf(5))) | Fin(6)
|
||||
acc-name: generalized-Rabin 3 2 3 0
|
||||
$a: 8 (Fin(0) & (Inf(1)&Inf(2))) | (Fin(3) & (Inf(4)&Inf(5)&Inf(6))) | Fin(7)
|
||||
acc-name: generalized-Rabin 3 1 2 0
|
||||
$a: 6 (Fin(0) & Inf(1)) | (Fin(2) & (Inf(3)&Inf(4))) | Fin(5)
|
||||
acc-name: generalized-Rabin 3 1 3 0
|
||||
$a: 7 (Fin(0) & Inf(1)) | (Fin(2) & (Inf(3)&Inf(4)&Inf(5))) | Fin(6)
|
||||
EOF
|
||||
diff output expected
|
||||
|
||||
|
|
@ -122,14 +122,14 @@ $randaut -n 10 2..4 -H | grep AP: > output
|
|||
cat output
|
||||
cat >expected <<EOF
|
||||
AP: 3 "p0" "p1" "p2"
|
||||
AP: 4 "p0" "p1" "p2" "p3"
|
||||
AP: 3 "p0" "p1" "p2"
|
||||
AP: 3 "p0" "p1" "p2"
|
||||
AP: 3 "p0" "p1" "p2"
|
||||
AP: 4 "p0" "p1" "p2" "p3"
|
||||
AP: 3 "p0" "p1" "p2"
|
||||
AP: 4 "p0" "p1" "p2" "p3"
|
||||
AP: 2 "p0" "p1"
|
||||
AP: 3 "p0" "p1" "p2"
|
||||
AP: 2 "p0" "p1"
|
||||
AP: 4 "p0" "p1" "p2" "p3"
|
||||
AP: 3 "p0" "p1" "p2"
|
||||
EOF
|
||||
diff output expected
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue