Browse Source
Turns out we can make quite a simple API out of it. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>bump-pyln-proto
Rusty Russell
5 years ago
11 changed files with 76 additions and 59 deletions
@ -0,0 +1,11 @@ |
|||
#include <common/pseudorand.h> |
|||
#include <common/random_select.h> |
|||
|
|||
bool random_select(double weight, double *tot_weight) |
|||
{ |
|||
*tot_weight += weight; |
|||
if (weight == 0) |
|||
return false; |
|||
|
|||
return pseudorand_double() <= weight / *tot_weight; |
|||
} |
@ -0,0 +1,20 @@ |
|||
#ifndef LIGHTNING_COMMON_RANDOM_SELECT_H |
|||
#define LIGHTNING_COMMON_RANDOM_SELECT_H |
|||
#include "config.h" |
|||
#include <stdbool.h> |
|||
|
|||
/* Use weighted reservoir sampling, see:
|
|||
* https://en.wikipedia.org/wiki/Reservoir_sampling#Algorithm_A-Chao
|
|||
* But (currently) the result will consist of only one sample (k=1) |
|||
*/ |
|||
|
|||
/**
|
|||
* random_select: return true if we should select this one. |
|||
* @weight: weight for this option (use 1.0 if all the same) |
|||
* @tot_wieght: returns with sum of weights (must be initialized to zero) |
|||
* |
|||
* This always returns true on the first non-zero weight, and weighted |
|||
* randomly from then on. |
|||
*/ |
|||
bool random_select(double weight, double *tot_weight); |
|||
#endif /* LIGHTNING_COMMON_RANDOM_SELECT_H */ |
Loading…
Reference in new issue