Я думаю, вы должны отделить свои цели. Один из них - заглушить ядро. И как вы упомянули. С rspec, например, вы можете сделать что-то вроде этого:
test_values = [1, 2, 3]
Kernel.stub!(:rand).and_return( *test_values )
Обратите внимание, что эта заглушка не будет работать, если вы не вызовете rand с Kernel в качестве получателя. Если вы просто позвоните «rand», тогда текущее «self» получит сообщение, и вы получите случайное число вместо test_values.
Вторая цель - сделать что-то вроде полевого теста, в котором вы на самом деле генерируете случайные числа. Затем вы должны использовать некоторую терпимость, чтобы убедиться, что вы приблизились к желаемому проценту. Это никогда не будет идеальным, хотя, вероятно, потребуется человек, чтобы оценить результаты. Но это все же полезно сделать, потому что вы можете понять, что другой генератор случайных чисел может быть лучше, например, чтение из / dev / random. Кроме того, хорошо иметь такой вид тестирования, потому что, допустим, вы решили перейти на платформу нового типа, системные библиотеки которой не так хороши в генерации случайности, или в определенной версии есть какая-то ошибка. Тест может быть предупреждающим знаком.
Это действительно зависит от ваших целей. Вы хотите проверить только свой алгоритм взвешивания или случайность?