Поскольку я не могу добавить комментарий, я должен написать что-то похожее на новый ответ, но, вероятно, это не так.
Код, данный Стивом К, не работал в VCS G-2012.09 (с пакетом обновления) из-за следующих проблем:
mean
и std_deviation
, используемые в gaussian_dist()
, не должны быть rand
переменными. Я только что инициализировал их в приведенном ниже примере, но их также можно назначить в pre_randomize()
, который вызывается перед любой рандомизацией.
gaussian_dist()
не разрешено изменять переменные, отличные от локальных для функции. Вызов $dist_normal
изменяет seed
, поэтому в качестве аргумента для функции можно сделать обходной путь seed
.
Вот аналогичный код с разрешенными проблемами:
class C;
int seed = 1;
int mean = 100;
int std_deviation = 20;
rand int value;
function int gaussian_dist (int seed);
return $dist_normal (seed, mean, std_deviation);
endfunction
constraint c_value { value == gaussian_dist (seed); }
endclass
Однако недостатком этого кода является то, что новое значение "seed", заданное $dist_normal
, выбрасывается, и для последующей рандомизации пользователь должен каким-то образом установить переменную seed
(так как с тем же seed
значение $dist_normal
даст тот же результат).
Одним из вариантов будет использование pre_randomize()
или post_randomize()
для рандомизации гауссовой переменной вместо помещения ее в блоки constraint
.