ColdFusion - 生成随机文本(ID)答案列表
ColdFusion - Generate Random Text(ID) Answer List
我正在尝试创建随机测试答案。
使用唯一 ID(文本)- 下面仅在我使用列表时随机化列表一次。
如果我重新加载页面,它不会再次随机化。
此外 - 如果它是只有 2 个选项的对错答案。没用。
大家有什么想法吗?或者有没有更简单的方法来做到这一点。我知道我可以很容易地用数字来做到这一点,但我更喜欢在文本中使用唯一的答案 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>
它在重新加载后不重新随机化列表的原因是因为结构没有排序。您最好使用数组甚至 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>
如果您正在寻找 return 随机答案列表,您可以使用 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:根据您要对列表执行的操作,将打乱的答案留在数组对象中并使用它可能会容易得多。此外,Java Collection.shuffle()
将与结构一起使用。您是从查询生成答案列表吗?这仍然有效,但取决于您之后如何使用查询,您可能不想直接在查询对象上使用 shuffle()
。
我正在尝试创建随机测试答案。 使用唯一 ID(文本)- 下面仅在我使用列表时随机化列表一次。 如果我重新加载页面,它不会再次随机化。
此外 - 如果它是只有 2 个选项的对错答案。没用。
大家有什么想法吗?或者有没有更简单的方法来做到这一点。我知道我可以很容易地用数字来做到这一点,但我更喜欢在文本中使用唯一的答案 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>
它在重新加载后不重新随机化列表的原因是因为结构没有排序。您最好使用数组甚至 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>
如果您正在寻找 return 随机答案列表,您可以使用 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:根据您要对列表执行的操作,将打乱的答案留在数组对象中并使用它可能会容易得多。此外,Java Collection.shuffle()
将与结构一起使用。您是从查询生成答案列表吗?这仍然有效,但取决于您之后如何使用查询,您可能不想直接在查询对象上使用 shuffle()
。