ADX中|sample算子如何设置随机种子以实现固定采样结果?
固定种子实现ADX重复抽样相同结果
ADX的sample运算符本身不支持直接指定随机种子,没法直接让每次执行返回完全相同的样本,但可以通过其他方法模拟带固定种子的随机抽样,保证每次结果一致。
实现方法
核心思路是给数据表的每一行生成一个基于固定种子+行唯一标识的固定数值,通过排序这个数值后取前N条,替代sample的随机抽样效果。
示例代码1:用rand()结合固定种子
let data=datatable(timestamp:datetime, metric: real) [ datetime(2017-01-01), 1, datetime(2017-01-02), 2, datetime(2017-01-03), 3, datetime(2017-01-04), 4, datetime(2017-01-05), 5, datetime(2017-01-06), 6, ]; let fixed_seed = 12345; // 自定义固定种子,可随意修改 data | extend random_value = rand(fixed_seed, hash(timestamp, metric)) // 用行的唯一特征(时间戳+指标)和种子生成固定随机值 | sort by random_value | take 2
示例代码2:用哈希函数结合固定种子
如果觉得rand()的方式不够直观,也可以用哈希函数生成固定值:
let data=datatable(timestamp:datetime, metric: real) [ datetime(2017-01-01), 1, datetime(2017-01-02), 2, datetime(2017-01-03), 3, datetime(2017-01-04), 4, datetime(2017-01-05), 5, datetime(2017-01-06), 6, ]; let fixed_seed = 12345; data | extend hash_val = hash(concat(tostring(timestamp), tostring(metric), fixed_seed)) // 拼接行特征和种子后生成哈希值 | sort by hash_val | take 2
原理说明
sample是无固定种子的随机抽样,每次执行的随机源不同,所以结果不一致;- 上面的方法通过固定种子+行的唯一特征(比如时间戳、指标值的组合)生成唯一且固定的数值,排序后取前N条,只要种子不变、表数据不变,每次执行都会得到相同的样本。
内容的提问来源于stack exchange,提问作者Windfish
相关产品推荐
相关产品推荐

