diff --git a/unsupported/test/cxx11_tensor_random.cpp b/unsupported/test/cxx11_tensor_random.cpp index db370a6a8..7cc2a2f90 100644 --- a/unsupported/test/cxx11_tensor_random.cpp +++ b/unsupported/test/cxx11_tensor_random.cpp @@ -14,44 +14,44 @@ template static void test_default() { Tensor vec(6); - vec.setRandom(); // Fixme: we should check that the generated numbers follow a uniform // distribution instead. // For low-precision types (half, bfloat16), the RNG has limited distinct - // values (e.g. 128 for bfloat16), so adjacent collisions are statistically - // inevitable. Only verify that not all values are identical. - if (sizeof(Scalar) <= 2) { - bool has_distinct = false; - for (int i = 1; i < 6 && !has_distinct; ++i) { - if (vec(i) != vec(i - 1)) has_distinct = true; - } - VERIFY(has_distinct); - } else { + // values (e.g. 128 for bfloat16), so adjacent collisions are possible. + // Retry a few times to avoid spurious failures. + bool all_distinct = false; + for (int attempt = 0; attempt < 10 && !all_distinct; ++attempt) { + vec.setRandom(); + all_distinct = true; for (int i = 1; i < 6; ++i) { - VERIFY_IS_NOT_EQUAL(vec(i), vec(i - 1)); + if (vec(i) == vec(i - 1)) { + all_distinct = false; + break; + } } } + VERIFY(all_distinct); } template static void test_normal() { Tensor vec(6); - vec.template setRandom>(); // Fixme: we should check that the generated numbers follow a gaussian // distribution instead. - if (sizeof(Scalar) <= 2) { - bool has_distinct = false; - for (int i = 1; i < 6 && !has_distinct; ++i) { - if (vec(i) != vec(i - 1)) has_distinct = true; - } - VERIFY(has_distinct); - } else { + bool all_distinct = false; + for (int attempt = 0; attempt < 10 && !all_distinct; ++attempt) { + vec.template setRandom>(); + all_distinct = true; for (int i = 1; i < 6; ++i) { - VERIFY_IS_NOT_EQUAL(vec(i), vec(i - 1)); + if (vec(i) == vec(i - 1)) { + all_distinct = false; + break; + } } } + VERIFY(all_distinct); } struct MyGenerator {