// generate a random uint32, according to bernoulli distribution uint32_t random_bernoulli_uint32(double tau) { uint8_t i = 0; uint32_t n = 0; for(; i < 32; i++) { n <<= 1; n ^= (uint32_t)random_bernoulli(tau); } return n; }
static GnmValue * gnumeric_randbernoulli (GnmFuncEvalInfo *ei, GnmValue const * const *argv) { gnm_float p = value_get_as_float (argv[0]); if (p < 0 || p > 1) return value_new_error_NUM (ei->pos); return value_new_float (random_bernoulli (p)); }
static gboolean tool_random_engine_run_bernoulli (data_analysis_output_t *dao, tools_data_random_t *info, bernoulli_random_tool_t *param) { int i, n; for (i = 0; i < info->n_vars; i++) { for (n = 0; n < info->count; n++) { gnm_float tmp = random_bernoulli (param->p); dao_set_cell_int (dao, i, n, (int)tmp); } } return FALSE; }