代码之家  ›  专栏  ›  技术社区  ›  Olga Pshenichnikova

获取可变数组随机索引的确定性随机算法

  •  -1
  • Olga Pshenichnikova  · 技术社区  · 7 年前

    我们需要在PL/SQL上实现彩票。
    每次我们有带数字的变量数组时,我们需要随机但确定性的(否 rand() )使用指定的算法选择项目。
    选择必须可重复。
    你能推荐每种语言中的一些简短代码来在PL/SQL上实现它吗?

    我们尝试了:

    M = a+b+c+d+f; a,b,c,d,f∈0;9 
    

    哪里

    • N=10000∙a+1000∙b+100∙c+10∙d+1∙f
    • N 是数组长度
    • X = M/N
    2 回复  |  直到 7 年前
        1
  •  1
  •   mathguy    7 年前

    你知道“随机但确定性”在术语上是矛盾的,对吗?你的意思是“伪随机”吗?意思是“看起来随机,但可以重复”?这是你唯一的问题吗?

    要获得“可重复”的数字,需要将种子设置为固定值。这是一个简短的演示。

    begin
      for i in 1 .. 5 loop
        dbms_random.seed(0);
        for j in 1 .. 3 loop
          dbms_output.put_line( to_char(j) || '  ' || to_char(dbms_random.value()));
        end loop;
        dbms_output.new_line;
      end loop;
    end;
    /
    
    1  .06336524584357453639006685484602123728
    2  .82845982815535271890692108504429161911
    3  .2318203117180902342077609254034613121
    
    1  .06336524584357453639006685484602123728
    2  .82845982815535271890692108504429161911
    3  .2318203117180902342077609254034613121
    
    1  .06336524584357453639006685484602123728
    2  .82845982815535271890692108504429161911
    3  .2318203117180902342077609254034613121
    
    1  .06336524584357453639006685484602123728
    2  .82845982815535271890692108504429161911
    3  .2318203117180902342077609254034613121
    
    1  .06336524584357453639006685484602123728
    2  .82845982815535271890692108504429161911
    3  .2318203117180902342077609254034613121
    

    当然,如果需要选择数组的“随机”(伪随机)索引,比如0到23之间(如果索引从1到0,则调整此值):

    ... trunc(dbms_random.value(0, 24))
    

    (请注意 dbms_random.value(0, 24) 将返回一个值,该值大于等于0和lt;24).

        2
  •  0
  •   Davide Spataro Amey    5 年前

    最简单的方法是对所有元素进行AND和XOR运算,最后将MOD转换为元素列表的长度。 问题是,该算法必须具有相同输入值的可重复性。 它不能基于随机函数。