随机化问题和存储以供以后检索
Randomise Questions and Storage for Later Retrieval
各位,我正在为这个绞尽脑汁,希望power apps高手帮帮忙。我正在设计一个面试提问应用程序。这将需要来自 10 个不同类别的 38 个问题,每个类别随机 select 个问题,然后随机 select 6 个。那部分没问题。
棘手的一点是我们必须让两个面试官在应用程序中以相同的顺序看到相同的问题。目前的解决方案是Onselect at start;
- 将问题列表构建到临时集合中。
- 运行 if 语句以查看是否先前已为同一日期分配了候选人 ID
-如果是,请提出这些问题(但是它们目前的顺序不正确并且无法将它们放入其中)
-如果否,将生成的合集放入分享点列表中,供以后检索。
存储的原因是应用程序内部会触发随机化,但第二位评估员在登录并输入候选人 ID 时会有相同的问题集。
目前的解决方案行为首先是命中或未命中,有时集合不适用,其次,它不会从存储中收到订单 ID,这意味着我们可以提取问题,但它们是顺序不对。
因此使用的数据集是:
由唯一 ID Question_ID
索引的静态 excel 问题列表,问题本身和正在测试的 Value
最终成为Temp_Q_Ordered
的临时集合Temp_Q
包含 Candidate_ID
、Session_date
、Order_IF
和 Question_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}))
)
编辑 - 您的代码的实际问题是 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 列表和尝试存储值的麻烦。
各位,我正在为这个绞尽脑汁,希望power apps高手帮帮忙。我正在设计一个面试提问应用程序。这将需要来自 10 个不同类别的 38 个问题,每个类别随机 select 个问题,然后随机 select 6 个。那部分没问题。
棘手的一点是我们必须让两个面试官在应用程序中以相同的顺序看到相同的问题。目前的解决方案是Onselect at start;
- 将问题列表构建到临时集合中。
- 运行 if 语句以查看是否先前已为同一日期分配了候选人 ID -如果是,请提出这些问题(但是它们目前的顺序不正确并且无法将它们放入其中) -如果否,将生成的合集放入分享点列表中,供以后检索。
存储的原因是应用程序内部会触发随机化,但第二位评估员在登录并输入候选人 ID 时会有相同的问题集。
目前的解决方案行为首先是命中或未命中,有时集合不适用,其次,它不会从存储中收到订单 ID,这意味着我们可以提取问题,但它们是顺序不对。
因此使用的数据集是:
由唯一 ID
Question_ID
索引的静态 excel 问题列表,问题本身和正在测试的Value
最终成为
的临时集合Temp_Q_Ordered
Temp_Q
包含
的共享点列表Candidate_ID
、Session_date
、Order_IF
和Question_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}))
)
编辑 - 您的代码的实际问题是 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 列表和尝试存储值的麻烦。