【问题标题】:Randomise Questions and Storage for Later Retrieval随机化问题和存储以供以后检索
【发布时间】:2021-06-15 07:08:14
【问题描述】:

伙计们,我正在为此绞尽脑汁,希望电源应用程序大师可以提供帮助。我正在设计一个面试提问应用程序。这将从 10 个不同的类别中抽取 38 个问题,从每个类别中随机选择一个问题,然后随机选择其中的 6 个。那部分很好。

棘手的一点是,我们必须让两名面试官在应用程序中以相同的顺序查看相同的问题。目前的解决方案是一开始就Onselect;

  • 将问题列表构建到一个临时集合中。
  • 运行 if 语句以查看候选人 ID 是否已在同一日期分配 - 如果是,请提出这些问题(但是它们目前的顺序不正确,无法将它们纳入其中) - 如果否,则将生成的集合放入共享点列表中以供以后检索。

存储的原因是应用程序内部的随机触发,但第二个评估员登录并输入候选人 ID 时,将有相同的问题集。

目前的解决方案行为首先是命中或未命中,有时集合不适用,其次它不会从存储中收到订单ID,这意味着我们可以拉出问题,但它们不在正确的顺序。

因此使用的数据集是:

  • 由唯一 ID Question_ID、问题本身和正在测试的 Value 索引的问题的静态 Excel 列表

  • 一个临时集合Temp_Q,最终变成Temp_Q_Ordered

  • 包含Candidate_IDSession_dateOrder_IFQuestion_ID 的共享列表Candidate_Q_ID_Storage

这是当前代码和link to some dummy data in the same format that I am using.,如果有帮助,我很乐意尽我所能提供。我希望这是一个明显的逻辑问题。

//Clear existing Collection
Clear(Temp_Q);
Clear(Temp_Q_Sorted; 
Clear(Temp_Q_Ordered); 

//Build Collection                                                                                                                                                                                                                                                                                                                                                           
Collect(Temp_Q,FirstN(Shuffle(Filter(Question_Set,Value = "Analyse Critically")),1));                                                         
Collect(Temp_Q,FirstN(Shuffle(Filter(Question_Set,Value = "Collaborative")),1));
Collect(Temp_Q,FirstN(Shuffle(Filter(Question_Set,Value = "Deliver,Support, Inspire")),1));
Collect(Temp_Q,FirstN(Shuffle(Filter(Question_Set,Value = "Emotionally Aware")),1));
Collect(Temp_Q,FirstN(Shuffle(Filter(Question_Set,Value = "Impartiality")),1));
Collect(Temp_Q,FirstN(Shuffle(Filter(Question_Set,Value = "Integrity")),1));
Collect(Temp_Q,FirstN(Shuffle(Filter(Question_Set,Value = "Open-Minded")),1));
Collect(Temp_Q,FirstN(Shuffle(Filter(Question_Set,Value = "Ownership")),1));
Collect(Temp_Q,FirstN(Shuffle(Filter(Question_Set,Value = "Public Service")),1));
Collect(Temp_Q,FirstN(Shuffle(Filter(Question_Set,Value = "Transparency")),1));

//Get list of 6 questions

ClearCollect(                                                                                                                                                                                                                                                                                                                                                     
    Temp_Q_Sorted,
    FirstN(Shuffle(Temp_Q),6));

// Add in the mandatory diversity question
Collect(Temp_Q_Sorted,FirstN(Shuffle(Diversity),1));                                                                                                                                                                                      

// Create row number index
ForAll (Temp_Q_Sorted,                                                                                                                                                                                                                                                                                                                               
   Collect(Temp_Q_Ordered,
     Last(FirstN(AddColumns(Temp_Q_Sorted, "RowNumber", CountRows(Temp_Q_Ordered)+1),
        CountRows(Temp_Q_Ordered)+1
         )
     )
   )
)

//Where things get iffy (pardon the pun)

If(And(Assessing_Text.Text in Candidate_Q_ID_Storage.Title, Today() in Candidate_Q_ID_Storage.Session_Date),
ClearCollect(Temp_Q_Ordered,
Filter(Question_Set,
     Question_ID in
      Filter
      (Candidate_Q_ID_Storage,
          Assessing_Text.Text =  Title && Today() = Session_Date
       ).Question_ID));

// Where is where I cannot get the order to stay the same, I have tried to call the column from retrieval into the new set, but to no avail.

       ,
ForAll(Temp_Q_Ordered,Patch(Candidate_Q_ID_Storage, Defaults(Candidate_Q_ID_Storage),
{Title: Assessing_Text.Text,
Session_Date: Today(),
Question_ID:Question_ID,
Order_ID:RowNumber}))
)

【问题讨论】:

    标签: sharepoint powerapps


    【解决方案1】:

    编辑 - 您的代码的实际问题是 PowerApps 中的 ForAll 没有以一致的顺序运行。在 ForAll 中,基本上所有行都同时运行,并且它们倾向于以随机顺序完成。解决这个问题的所有方法都很老套,而且往往涉及计时器。

    如果洗牌公式有种子输入,则该问题的理想解决方案是。种子允许随机数生成器为相同的输入(在您的情况下为候选 ID)提供相同的结果。

    遗憾的是,PowerApps 不支持种子。但是,您可以改为使用非常简单的哈希。一个简单的哈希将给出一个随机输出,对于给定的输入总是相同的

    假设您有一个单一类别的问题列表,我们的候选 ID 是 333。我们可以通过将行号添加到候选 ID 来生成一些 ID 作为哈希的输入,例如

    Question QuestionKey
    1 334
    2 335
    3 336

    你可以通过将它乘以候选编号,除以它,任何其他方式来将它打乱。

    然后我们可以在 QuestionKey 上运行一个简单的哈希公式,它将 QuestionKeys 转换为不同的数字,这种方式不是完全随机的,但足以满足我们的目的

    Question HashResult
    1 888
    2 6
    3 24

    然后按哈希结果对表格进行排序并选择最上面的那个。因为您的编号是根据候选人 ID 进行的,所以面试官将始终看到相同的问题列表,并且由于哈希给出的答案有些随机,因此每个 ID 的顺序往往是唯一的。

    一个简单的哈希函数类似于 Cormen 的乘法方法

    HashResult = Mod(A*QuestionKey,1)*m

    其中 A 是 1 到 0 之间的数字(例如 0.884),m 是 2 的大幂(例如 8192)

    诚然,这个答案并不能完全解决您的设置问题,但我认为它要简单得多,并且会减少使用 Sharepoint 列表和尝试存储值的麻烦。

    【讨论】:

    • 感谢 Cazzym,这很有帮助。我不拘泥于当前的设置并且乐于改变。我仍在使用 PowerFX,因此了解ForAll 的行为可能与预期不同是非常有启发性的。同样,哈希函数也是一个绝妙的主意。你肯定已经为我设定了当天的工作日程。我会报告结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 2014-08-01
    • 1970-01-01
    • 2021-11-13
    相关资源
    最近更新 更多