【问题标题】:Randomly show three different questions per page load每个页面加载随机显示三个不同的问题
【发布时间】:2013-03-31 23:17:09
【问题描述】:

我不确定从哪里开始,寻找正确方向的推动力。我正在使用 C#。我需要向用户显示三个问题,但更重要的是我需要在每个页面加载时随机选择并显示这些问题。如果您的解决方案认为它是最简单的方法,我可以使用 MS SQL。

我有一个包含 10 个问题的列表,我希望一次显示三个问题,然后随机选择它们。做这个的最好方式是什么?

目前是这样设置的..

   <p> <label class="checkbox"><asp:CheckBox ID="QuesChk1" Value="1" Text="What street do they live on?"
        runat="server" /></label></p>
     <p> <label class="checkbox"><asp:CheckBox ID="QuesChk2" Value="2" Text="What is their middle name?"
        runat="server" /></label></p>
     <p> <label class="checkbox"><asp:CheckBox ID="QuesChk3" Value="3" Text="What branch do they visit the most?"
        runat="server" /></label></p>
    <asp:Button ID="Button1" OnClick="Next_Click" runat="server" Text="Next" />

【问题讨论】:

  • 您使用的是哪个 SQL 数据库?微软 SQL、MYSQL、甲骨文?
  • Microsoft SQL,抱歉忘了提。
  • 好的。你打算有多少问题?从你的问题我意识到你也可以在代码中做到这一点。这是 Web 应用程序还是 Windows 应用程序?
  • Web 应用程序,我计划总共只有 12 个问题。这就是为什么我不想只为这 12 个设置一个 SQL 表。
  • 您是否要将答案存储在某个地方?在这种情况下,除了问题之外,您至少需要有一个唯一的 ID,以及一个用于存储和回答的表格……除非您计划通过电子邮件发送答案或使用基于文件的解决方案。一切都取决于您的需求。

标签: c# asp.net sql sql-server checkbox


【解决方案1】:

如果您不想使用数据库,并且您已经解决了所有 10 个问题,请使用 viewstate 像

ViewState["Questions"] = new List<string>();

并向其添加问题

然后再有一个视图状态来检查您收到的订单是否不是最后一个订单

ViewState["LastOrder"] = new List<int>(){1,2,3};

然后生成随机订单,直到不是最后一个

int firstIndex, secondIndex, thirdIndex;
var lastOrder = (List<int>)ViewState["LastOrder"];

Random r = new Random(lastOrder[0] + lastOrder[1] + lastOrder[2]);

while(firstIndex == lastOrder[0]) 
   firstIndex = r.Next(1, 10);

while(secondIndex == lastOrder[1] || secondIndex == firstIndex) 
   secondIndex = r.Next(1, 10);

while(thirdIndex == lastOrder[2] || thirdIndex == firstIndex || thirdIndex == secondIndex)    
   thirdIndex = r.Next(1, 10);

// update current index as last index
ViewState["LastOrder"] = new List<int>(){firstIndex, secondIndex, thirdIndex};

在此之后,您将获得随机不重复的三个问题顺序

【讨论】:

  • 我现在就试一试。
  • 我只是一个初学者,所以我仍然坚持尝试将问题添加到 ViewState 列表中。是的,我不知道该怎么做。
【解决方案2】:

如果你对获得 3 个随机不重复的问题非常挑剔,那么你可以尝试:

在您有问题的 SQL 表中,如果没有,则必须有一个与它们关联的 ID 字段,然后创建一个,因为现在您有 10 个问题,ID 将在 1-10 之间。

现在在你的 c# 代码中你可以创建方法,它将得到:

Random random = new Random();
int randomNumber = random.Next(1, 10);

现在构建一个 SQL 查询“Select * from tab where ID = randomNumer”(针对第一个问题)。

将 randomNumber 存储在临时数组或列表中(用于比较目的),然后再次调用相同的方法并将其与现有数字进行比较(您可以使用返回 bool 的 Contains() 方法来简单地进行操作)如果它不相似然后将其添加到数组中并继续发布此问题。

您必须跟踪数组/列表的大小(如果

这必须为你锻炼,我用相同的算法为一家公司创建了一个入学测试,遗憾的是找不到代码。

祝你好运

【讨论】:

    【解决方案3】:

    如果您没有很多问题,并且它们将保持不变,那么安装整个数据库可能会过大。

    您可以在字符串(或更复杂的包含 ID 和字符串的对象)上创建一个 ArrayList,并使用随机函数 3 次来选择 3 个不同的元素。

    当然,您必须确认您没有选择相同的问题。

    之后做什么取决于您是否要存储答案。

    【讨论】:

    • 一个数据库可以让它随着时间的推移而扩展,即使它现在很小。这也很可能是学习使用数据库的学术练习。另请注意,使用数据库可以让您在不更改代码的情况下更改数据,这在许多情况下非常重要。
    • 我很清楚这一切。然而,在某些情况下,架构师/程序员可能会认为问题是最终的,因此添加新的 SQL 服务器以及中间的通信延迟将是多余的。这完全取决于程序员“Web 应用程序,我计划总共只有 12 个问题。这就是为什么我不想为这 12 个问题设置 SQL 表。”
    • 如果您担心网络通信,那么您只希望缓存问题,如果您不希望它们发生太大变化,可能会在不那么短的时间内缓存。
    • 当然,您可以保留缓存(在网络服务器上)或通过其他机制,但这一切都可以追溯到最终应用程序需要的灵活性。您当然非常正确,因为如果它需要动态和可扩展,那么数据库将是最低要求。如果要多次使用和扩展,也很可能需要一个管理界面(例如在轮询应用程序中)。
    【解决方案4】:

    听起来像 Random 可能是您正在寻找的东西。特别是,您应该看看Random.Next(int maxValue) 方法。

    如果我必须做这样的事情,我会收集问题并使用上述功能来抓取随机问题。不过,您必须通过选择相同的问题来解决问题。

    【讨论】:

      【解决方案5】:

      你总是可以这样做:

      SELECT TOP 3 * FROM QuestionsTable ORDER BY NEWID()
      

      请参阅此处了解其工作原理:"order by newid()" - how does it work?

      【讨论】:

      • 我会担心这种随机性的质量。对于某些系统来说可能没问题,但也可能不够随机。这还取决于拥有良好混洗数据的重要性。
      • NEWID() 必须返回一个唯一标识符,因此它应该始终是随机的,否则 GUID 会损坏。对于真正的随机数生成,我认为您必须使用放射性同位素和盖革计数器。显然,这就是他们为在线赌博所做的。
      • Unique != random。仅仅因为两个值不太可能相同并不意味着它们足以用作随机数。
      • 感谢您的链接,这很酷。你看到这个了吗? en.wikipedia.org/wiki/Globally_Unique_Identifier#Algorithm
      【解决方案6】:

      使用随机排序的 SQL 查询:

      SELECT * FROM QuestionsTable ORDER BY RAND() LIMIT 3
      

      【讨论】:

      • 出于兴趣,这适用于哪个数据库?我知道这不是 MS SQL。只是好奇。
      • 这适用于 mysql。不适用于 MS SQL,因为 LIMIT 不存在,而是 TOP。
      • 对了。但是ORDER BY RAND() 不会改变 MSSQL 中结果的顺序,所以它不起作用。
      猜你喜欢
      • 2013-12-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-26
      • 2019-12-01
      • 1970-01-01
      相关资源
      最近更新 更多