继续昨天的话题,昨天我们实现完全的随抽取列表元素,有一个问题就是可能几次会抽取同一个位置的元素:
1-50中随机抽取5个数值,点击刷新,就会出现不同的结果,如上图可能会出现两个相同的数值,如何确保每次都能抽取到不同的元素?
两个思路:
- 每次抽取结束后,被抽到的元素从列表中移除,再进行下次抽取
- 确保抽取的元素位置不重复
我们今天要用到的是第二种,我们用两个函数来确保取得非重复的位置:
- List.Distinct:获取非重复元素列表
- List.FirstN:获取前几个元素
昨天讲的产生随机整数的套路继续沿用,我们来看自定义函数:
let
源 =(l,n)=>List.Transform(
List.FirstN(
List.Distinct(
List.Transform(
{1..100},
(x)=>Number.IntegerDivide(Number.RandomBetween(0,List.Count(l)-1),1))
),
n),
(x)=>l{x})
in
源
代码有点长,我们分解来看:
最里层的List.Transform是产生一个随机整数的列表,为了防止出现重复导致列表元素去重复后数量不够,我们要求做100个随机数。具体的随机数的公式就不解释了,参照昨天的内容。
List.Distinct把这100个随机整数列表去重复。
List.FirstN取非重复整数列表的前n个元素。
最外层的List.transform就是根据List.FirstN产生的地址,取出列表l元素。
这样大家是不是就能够了解这个函数的意思了。
我们来看引用这个函数的结果:
我们从小写字母中,随机抽取5个字母,保证不重复。
欢迎加入圈子,学习更多Power Query相关的知识。