【问题标题】:Questionnaire system random questions问卷系统随机问题
【发布时间】:2022-09-02 11:34:21
【问题描述】:

如果有很多问题,请选择五个而不重复 这是怎么做的?非常感谢您的帮助

我的问题代码

Public Function GetQuestion( Byval QuestionNumber )
On Error Resume Next    
Dim MyUIWorkspace As New NotesUIWorkspace
Dim MyDoc As NotesDocument
Set MyDoc = MyUIWorkspace.CurrentDocument.Document

Dim Question
Dim LineNo
LineNo = 0
Forall Tmp In MyDoc.GetFirstItem( "Questions" ).Values
    If LineNo = QuestionNumber Then Question = Tmp
    LineNo = LineNo +1
End Forall
LineNo = 0
Forall Tmp In MyDoc.GetFirstItem( "Answers" ).Values
    If LineNo = QuestionNumber Then Answers = Tmp
    LineNo = LineNo +1
End Forall

Dim MyVar() As Variant
Redim MyVar(1)
MyVar(0) = Question
MyVar(1) = Answers

GetQuestion = MyVar

End Function

看法

【问题讨论】:

    标签: lotus-notes lotus-domino lotusscript lotus


    【解决方案1】:

    创建一个函数以从数组中获取随机数量的值...

    %REM
      WARNING: Modifies array argument
      n must be between <code>1</code> and < code>UBound(array) + 1</code>
    %END REM
    Function GetNRandomFromArray(array As Variant, ByVal n As Integer)
      Dim aRet(n - 1) As Variant
      Dim r as Integer
      Dim u as Integer
    
      u = UBound(array)
      For iRet = 0 To n - 1
        iFrom = Int(Rnd * (u + 1)) 'Random number from 0 to u
        aRet(iRet) = array(iFrom)
        If iFrom <> u Then array(iFrom) = array(u)
        u = u - 1 'decrement the number of questions to choose from in the next iteration
      Next iRet
    
      GetNRandomFromArray = aRet
    End Function
    

    现在你可以做

    Dim aRandomQuestions As Variant
    aRandomQuestions = GetNRandomFromArray(MyDoc.Questions, 5)
    

    (注意:MyDoc.QuestionsMyDoc.GetFirstItem( "Questions" ).Values 都返回一个值数组,这是一个快照……更改该数组不会自动影响字段的值。)

    【讨论】:

    • 所以换这个? Forall Tmp In GetNRandomFromArray(MyDoc.Questions, 5) If LineNo = QuestionNumber Then Question = Tmp LineNo = LineNo +1 End Forall
    • 非常聪明的方法来做“独特”的东西......我只是不喜欢输入数组的修改,而是更愿意处理它的副本。但除此之外……我喜欢……
    • @JSmart523 不起作用.....
    • 是的,它确实...如果正确完成...“不起作用”不是对错误的充分描述
    • 我更新了我的 GetQuestion Code , QuestionNumber 需要修改吗?If LineNo = QuestionNumber Then Question = Tmp
    【解决方案2】:

    首先计算问题。你已经这样做了。您的 LineNo 变量中有计数。

    接下来,使数组变暗以保存问题,并将所有问题读入数组。 (请注意,您可以通过重复使用 redim 将前两个步骤合二为一。我倾向于不喜欢这样做,但这完全可以。)

    接下来,调暗一个由五个整数组成的数组。并使用 Randomize 语句来播种 LotusScript 的随机数生成器,并使整数列表变暗。

    接下来,将一个计数器初始化为零,并执行一个 while 循环,当计数器大于 4 时退出。在循环体中,使用 Int(Rnd() * LineNo) 生成 s 范围为 0 到 LineNo 减一的随机整数。如果它在列表中,则循环没有递增计数器。如果它不在列表中,则将其添加到列表中,并将计数器用作整数数组的索引,并将数组的该元素设置为随机乘积,然后增加计数器。

    此时,您有一个问题数组,并且问题数组中还有另一个随机索引数组。

    最后,做一个从 0 到 4 的循环。在循环体中,从整数数组中读取一个索引,并使用它从问题数组中读取一个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-12
      • 2010-12-25
      • 2011-07-28
      • 2011-05-05
      • 2020-12-08
      相关资源
      最近更新 更多