ColdFusion - генерирует случайный текст (ID) список ответов - PullRequest
0 голосов
/ 13 октября 2018

Я пытаюсь создать случайные тестовые ответы.Использование уникального идентификатора (текст) - ниже случайный список только один раз, когда я его использую.Если я перезагружаю страницу, она снова не рандомизируется.

Также - если это Истинный Ложный Ответ только из 2 вариантов.Это не работает.

Есть мысли, ребята?Или есть более простой способ сделать это.Я знаю, что могу легко сделать это с числами, но у меня есть предпочтение для уникального идентификатора ответа в тексте)

      <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 голосов
/ 15 октября 2018

Если вы хотите вернуть рандомизированный список ответов, вы можете использовать Java Collections для взаимодействия со списком 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() будет работать со структурами.И вы генерируете список ответов из запроса?Это все еще будет работать, но в зависимости от того, как вы будете использовать запрос впоследствии, вы, вероятно, не захотите использовать shuffle() непосредственно для объекта запроса.

0 голосов
/ 15 октября 2018

Причина, по которой он не производит повторную рандомизацию вашего списка после перезагрузки, заключается в том, что структуры не упорядочены.Вам лучше использовать массив или даже хеш-таблицу 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>
...