2

这是我的设置。在曲棍球比赛中,球员们形成同时在冰上的“线”。“前锋”线是由左翼、中锋和右翼组成的三人组。“D”线是一对左 D 和右 D。在啤酒联赛中,您通常穿着 13 名滑手 = 3 名前锋线,2 名 D 线加上一名守门员。

假设我有 20 个人想玩。我想从 13 个随机滑冰者中构建线条。我必须保留他们的名字和球衣号码。我想知道这是否是Chapel Domains的工作。例如,像

var player_ids: domain(1) = {1..20}
var jerseys [player_ids] = [71, 99, 97, ...]
var names [player_ids] = ['Alice', 'Bonobo', 'Changarakoo'...]

这是一个简单的想法,但现在我想

1. Pick three random players and assign them to Line 1 F
2. Pick three from the remainders and assign the to Line 2 F
...
n-1: Use the player ids to create an indicator matrix (details aren't important)
n: WIN!

关键n-1是我必须能够在最后引用球员 ID 和球衣号码。

教堂中的正确模式是什么?

4

2 回答 2

2

啤酒曲棍球队教练也
可以使用这个概念(当然,数字会有所不同,没有设置固定的 RNG 种子)

( live >>> online )

让我们更深入地了解这个过程。随机选择是故事中数学上更难的部分(与教练本人相比,合规性将使滑冰场以外领域的问题更加复杂(参考下文))。

所以,让我们接受团队设置是一个静态地图,其中玩家的序号映射到F_line{1..3,1..3}, D_line{1..2,1..2}, G, Rest{1..7}

use Random;
var              aRandomTEAM = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 ]; // a known, contiguous ENUM of <anonymised_HASH_ID#s>
    permutation( aRandomTEAM );                                                                           // a known, static MAP of aRandomTEAM -> F_line{1..3}, D_line1{1..2}, G, Rest
for                          id in {1..13}{
    writeln(                   "            a Static MAP position of TEAM[",
                             id, "]: will be played by anonymised_HASH_ID#( ",
                 aRandomTEAM[id],                                         " )"
             );
    }

对于人类可读的检查,这会产生:

a Static MAP position of TEAM[1]: will be played by anonymised_HASH_ID#( 20 )
a Static MAP position of TEAM[2]: will be played by anonymised_HASH_ID#( 5 )
a Static MAP position of TEAM[3]: will be played by anonymised_HASH_ID#( 11 )
a Static MAP position of TEAM[4]: will be played by anonymised_HASH_ID#( 4 )
a Static MAP position of TEAM[5]: will be played by anonymised_HASH_ID#( 15 )
a Static MAP position of TEAM[6]: will be played by anonymised_HASH_ID#( 7 )
a Static MAP position of TEAM[7]: will be played by anonymised_HASH_ID#( 16 )
a Static MAP position of TEAM[8]: will be played by anonymised_HASH_ID#( 12 )
a Static MAP position of TEAM[9]: will be played by anonymised_HASH_ID#( 8 )
a Static MAP position of TEAM[10]: will be played by anonymised_HASH_ID#( 18 )
a Static MAP position of TEAM[11]: will be played by anonymised_HASH_ID#( 19 )
a Static MAP position of TEAM[12]: will be played by anonymised_HASH_ID#( 17 )
a Static MAP position of TEAM[13]: will be played by anonymised_HASH_ID#( 3 )

但是,机器可读的后处理可以将这些映射到请求的数组上,保持敏感的个人详细信息安全和分开,将 GUID#-reference 链接到名称和所有其他详细信息的安全。参照完整性既便宜又安全,并且从(有意)连续序数到代理匿名哈希表的静态唯一关联映射的实现是微不足道的(参考 Opaque Domains and Arrays 以获得可能的进一步启发)。


法律警告:

如果在受监管的领域中使用随机化,则应采取适当的谨慎措施,其中必须记录合规性并执行和验证方法稳健性的积极证据。

文档可能会提供有关在某些法律要求严格的领域中使用当前随机化实现的已知风险的更多详细信息:

置换线性同余随机数生成器

该模块提供 PCG 随机数生成例程。请参阅http://www.pcg-random.org/和论文,PCG:ME O'Neill 的一系列简单快速空间高效的随机数生成统计良好算法。

应该特别注意一些已知的潜在限制,例如:

笔记

对于整数,此类使用一种策略来生成特定范围内的值,该值尚未经过严格研究并且可能存在统计问题。

对于实数,此类通过计算 [0,1] 中的随机值并缩放和移动该值来生成 [max, min] 中的随机值。请注意,并非区间 [min, max] 中所有可能的浮点值都可以以这种方式构造。

此类言论应始终引起合规官的应有注意,以便在其预期的(受监管的)问题域强制性实践和受控环境的要求内仔细预先验证使用的可行性。

于 2017-08-16T05:19:08.873 回答
2

这是我的建议。为了在没有替换的情况下吸引玩家,我从概念上考虑洗牌一副牌——每张牌上都有一个玩家的名字。所以这段代码使用了 Random.shuffle

use Random;

var player_ids = {1..20};
// jersey number, name are simply keyed off off player_id

// Generate an array of player IDs
var ids_array = [i in player_ids] i;

// Randomly shuffle player IDs
shuffle(ids_array);

// Now select from the shuffled IDs the players for the game.

var cur = 1;
getLine(cur, "Forward1", 3, ids_array);
getLine(cur, "Forward2", 3, ids_array);
getLine(cur, "Forward3", 3, ids_array);
getLine(cur, "D1", 2, ids_array);
getLine(cur, "D2", 2, ids_array);
getLine(cur, "Goalie", 1, ids_array);

proc getLine(ref curIndex, lineName, playersNeeded, ids_array) {
  writeln("Line ", lineName, ":");
  for i in 1..playersNeeded {
    writeln("  player ", ids_array[curIndex]); // would use name & jersey..
    curIndex += 1;
  }
}
于 2017-08-16T17:14:24.000 回答