RandomTest.cpp 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. 
  2. #include "../testTools.h"
  3. #include "../../DFPSR/api/randomAPI.h"
  4. START_TEST(Random)
  5. {
  6. RandomGenerator generator = random_createGenerator(123456789u);
  7. // Generate ten million values and add them to a histogram.
  8. uint64_t histogram[100] = {};
  9. for (int32_t v = 0; v < 10000000; v++) {
  10. int64_t result = random_generate_range(generator, 0, 99);
  11. histogram[result]++;
  12. }
  13. // Check that none of the values occurs more than 2% from the expected average.
  14. for (int32_t h = 0; h < 100; h++) {
  15. ASSERT_LESSER(histogram[h], 102000);
  16. ASSERT_GREATER(histogram[h], 98000);
  17. }
  18. }
  19. {
  20. RandomGenerator generator = random_createGenerator(4857623u);
  21. // 0% probability
  22. uint64_t trueCount = 0u; uint64_t falseCount = 0u;
  23. for (int32_t h = 0; h < 10000000; h++) {
  24. if (random_generate_probability(generator, 0)) {
  25. trueCount++;
  26. } else {
  27. falseCount++;
  28. }
  29. }
  30. ASSERT_EQUAL(trueCount, 0u);
  31. ASSERT_EQUAL(falseCount, 10000000u);
  32. // Out of bound probability
  33. trueCount = 0u; falseCount = 0u;
  34. for (int32_t h = 0; h < 10000000; h++) {
  35. if (random_generate_probability(generator, -25)) {
  36. trueCount++;
  37. } else {
  38. falseCount++;
  39. }
  40. }
  41. ASSERT_EQUAL(trueCount, 0u);
  42. ASSERT_EQUAL(falseCount, 10000000u);
  43. // 100% probability
  44. trueCount = 0u; falseCount = 0u;
  45. for (int32_t h = 0; h < 10000000; h++) {
  46. if (random_generate_probability(generator, 100)) {
  47. trueCount++;
  48. } else {
  49. falseCount++;
  50. }
  51. }
  52. ASSERT_EQUAL(trueCount, 10000000u);
  53. ASSERT_EQUAL(falseCount, 0u);
  54. // Out of bound probability
  55. trueCount = 0u; falseCount = 0u;
  56. for (int32_t h = 0; h < 10000000; h++) {
  57. if (random_generate_probability(generator, 125)) {
  58. trueCount++;
  59. } else {
  60. falseCount++;
  61. }
  62. }
  63. ASSERT_EQUAL(trueCount, 10000000u);
  64. ASSERT_EQUAL(falseCount, 0u);
  65. // 50% probability
  66. trueCount = 0u; falseCount = 0u;
  67. for (int32_t h = 0; h < 10000000; h++) {
  68. if (random_generate_probability(generator, 50)) {
  69. trueCount++;
  70. } else {
  71. falseCount++;
  72. }
  73. }
  74. ASSERT_GREATER(trueCount , 4990000u);
  75. ASSERT_GREATER(falseCount, 4990000u);
  76. }
  77. {
  78. // Making sure that the random generator does not break backward compatibility by changing its behavior.
  79. RandomGenerator generator = random_createGenerator(1223334444u);
  80. List<int32_t> generatedValues;
  81. for (int32_t h = 0; h < 100; h++) {
  82. generatedValues.push(random_generate_range(generator, -200, 200));
  83. }
  84. ASSERT_EQUAL(generatedValues,
  85. List<int32_t>(
  86. -192, -196, -106, -134, -72, -43, 52, -113, 51, 39, -29, 25, -2, 91, -109, 56, -17, -80, -59, 6, 185,
  87. -18, 102, 137, 166, -188, 130, -41, -100, -29, 160, 68, -171, -84, -76, 27, -151, -168, -91, 171, 155,
  88. -139, 46, 185, -140, -60, -173, 0, 81, -73, 36, -33, 145, -31, 73, 152, -107, -140, -63, 181, 176, -142,
  89. -122, 97, 102, 151, -110, 19, 103, -78, 21, -82, -89, -77, -69, -14, 27, -24, 6, 94, 186, -185, -71,
  90. -184, 127, -97, 173, -179, 70, -74, 13, 3, 11, 129, 116, -58, 35, -175, 116, -69));
  91. }
  92. END_TEST