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