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:
Alexandre Duret-Lutz 2015-06-01 19:43:21 +02:00
parent eabed370bf
commit a75a9c091c
4 changed files with 2073 additions and 1800 deletions

View file

@ -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_;

View file

@ -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