ColdFusion-生成随机文本(ID)答案列表

时间:2018-10-13 19:20:47

标签: random coldfusion cfloop

我正在尝试创建随机测试答案。 使用唯一ID(文本)-当我使用列表时,下面仅将列表随机化一次。 如果我重新加载页面,它不会再次随机化。

也-如果仅是2个选择,则为True False。它不起作用。

有什么想法的人吗?还是有一种更简单的方法来做到这一点。我知道我可以轻松地用数字来完成此操作,但是我偏爱文本中的唯一答案ID)

      <cfset strList = "rttt,ddde,ffss,gggd" /> - works only once

      <cfset strList = "True,False" /> - doesn't work

      <!---
     Create a struct to hold the list of selected numbers. Because
     structs are indexed by key, it will allow us to not select
     duplicate values.
      --->

     <cfset objSelections = {} />

      <!--- Now, all we have to do is pick random numbers until our
     struct count is the desired size (4 in this demo).
      --->

      <cfloop condition="(StructCount( objSelections ) LT 4)">

     <!--- Select a random list index. --->
     <cfset intIndex = RandRange( 1, ListLen( strList ) ) />

     <!---
        Add the random item to our collection. If we have
        already picked this number, then it will simply
        overwrite the previous and the StructCount() will
        not be changed.
     --->
     <cfset objSelections[ ListGetAt( strList, intIndex ) ] = true />

      </cfloop>

      <cfoutput>
      <!--- Output the list collection. --->
      <cfset newlist = "#StructKeyList( objSelections )#">

      #newlist#

      </cfoutput>

2 个答案:

答案 0 :(得分:1)

如果您希望返回随机的答案列表,则可以使用Java集合与ColdFusion列表进行交互(将列表转换为数组之后)。

<cfscript>
  // Our original answer list.
  strlist1 = "rttt,ddde,ffss,gggd" ;

  // Convert our lists to arrays. 
  answerArray1 = ListToArray(strList1) ;

  // Create the Java Collection object. 
  C = CreateObject( "java", "java.util.Collections" ) ;

  // Java shuffle() our array.
  C.shuffle(answerArray1) ;

  // Output our shuffled array (as an array).
  writeDump(answerArray3) ;
  // Or convert it to a list for output.
  randomAnswerList = ArrayToList(answerArray3) ;
  writeoutput(randomAnswerList) ;
</cfscript>

https://trycf.com/gist/3a1157a11154575e705411814d10ea92/acf?theme=monokai

由于您正在使用小型列表,因此Java的shuffle()应该很快。对于大型列表,我认为它比建立随机函数来随机排列列表要低得多。之所以可行,是因为ColdFusion数组自动也是Java数组。 CF与Java配合得很好,尤其是对于这些类型的操作。

注1:Java shuffle()直接在其输入数组上运行,因此您实际上是在更改数组本身。

注2:根据您要对列表执行的操作,将随机组合的答案留在Array对象中并使用它可能会容易得多。另外,Java Collection.shuffle()将与Structs一起使用。您是否正在根据查询生成答案列表?仍然可以使用,但是根据以后使用查询的方式,您可能不想直接在查询对象上使用shuffle()

答案 1 :(得分:0)

重新加载后之所以不重新随机化列表的原因是因为未对结构进行排序。您最好使用数组甚至Java哈希表。如果我理解正确,那么您只是在尝试获取列表,然后输出列表的重新排序版本?也许以前以比这更可疑的形式回答了此问题,但是如果我正确理解了您的要求,这是一种方法:

<cfset strList = "rttt,ddde,ffss,gggd" />

<cfset newlist = "">
<cfloop condition="ListLen(strList)">
    <cfset intIndex = RandRange( 1, ListLen( strList ) ) />
    <cfset newlist = ListAppend(newlist, ListGetAt(strList, intIndex))>
    <cfset strList = ListDeleteAt(strList, intIndex)>
</cfloop>

<cfoutput>#newlist#</cfoutput>