随机化问题和存储以供以后检索

Randomise Questions and Storage for Later Retrieval

各位,我正在为这个绞尽脑汁,希望power apps高手帮帮忙。我正在设计一个面试提问应用程序。这将需要来自 10 个不同类别的 38 个问题,每个类别随机 select 个问题,然后随机 select 6 个。那部分没问题。

棘手的一点是我们必须让两个面试官在应用程序中以相同的顺序看到相同的问题。目前的解决方案是Onselect at start;

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

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

因此使用的数据集是:

这是当前代码和 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}))
)

编辑 - 您的代码的实际问题是 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

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

一个简单的散列函数类似于 Cormen 的乘法

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

其中 A 是 1 和 0 之间的数字(例如 0.884),m 是 2 的较大次方(例如 8192)

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