RE: [xsl] Seed problem in FXSL randomizeList

Subject: RE: [xsl] Seed problem in FXSL randomizeList
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Wed, 7 Oct 2009 09:14:34 +0100
You seem to be expecting that two pseudo-random sequences starting with
different seeds will have no discernable relationship to each other. That
might be a property of some randomizers, but it is not necessarily a
property of every randomizer, and it appears not to be true of this one. The
best you can expect is that within a random sequence, each number is
unrelated to the previous one. I would suggest that rather than adding 11 to
the seed for your first sequence to get the seed for your second sequence,
you use the first ("primary") seed to get a random set of numbers which you
then use as "secondary" seeds for the subsequent sequences. 


Michael Kay  

> -----Original Message-----
> From: jesper.tverskov@xxxxxxxxx 
> [mailto:jesper.tverskov@xxxxxxxxx] On Behalf Of Jesper Tverskov
> Sent: 06 October 2009 10:35
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] Seed problem in FXSL randomizeList
> I have tested the FXSL randomizeList template for a list of 
> type items/item. For each item I want the positions of the 
> other item elements returned in random order, and I need to 
> make use of the first four items in each random order.
> The items/item list I have used so far has 140 item elements.
> I have managed to solve the above using recursion, Saxon and 
> the command line. Processing time is a little less than 10s. 
> The first seed is made like this 
> xs:integer(format-time(current-time(),
> '[s][f]')). For the next seed I add 11, etc. It is a mystery 
> to me, that if I increase the values of "11" to just "12" the 
> transformation seems to go looping. Millions of lines are 
> generated and I have to stop the process. (I have tested this 
> strange behavior many times).
> Also the random order of the positions returned, are not that random.
> The first third of my lists start with the same position 
> number, the next third of the list adds just one to this 
> number, and the last third of the list adds two. The rest of 
> the positions look ok, at least I have not yet recognized a pattern.
> _Here is my question_.
> Is there anything I can do to get "random" lists returned, 
> that are more "random" for the first position? And how can I 
> change the XSLT stylesheet so it will also work for lists of 
> items of at least a couple of thousands without the need for 
> experimenting to find a number to add to the first seed that 
> will not break the transformation?
> <xsl:stylesheet version="2.0" 
> xmlns:xsl="";
>  xmlns:f=""; 
> xmlns:xs="";
>  exclude-result-prefixes="f xs">
>  <xsl:import 
> href="../../../../XSLT/fxsl-xslt2/fxsl-xslt2/f/randomList.xsl"/>
>  <!-- Can be applied on any source xml document (ignored) --> 
>  <xsl:output omit-xml-declaration="yes" indent="yes"/>
>  <xsl:template match="/">
>   <items>
>    <xsl:call-template name="item"/>
>   </items>
>  </xsl:template>
>  <xsl:template name="item">
>   <xsl:param name="pSeed" as="xs:integer"
> select="xs:integer(format-time(current-time(), '[s][f]'))"/>
>   <xsl:param name="num" select="1" as="xs:integer"/>
>   <item>
>    <name>
>     <xsl:value-of select="/items/item[$num]/name"/>
>    </name>
>   <xsl:variable name="x">
>    <xsl:call-template name="randomizeList">
>     <xsl:with-param name="pList" select="(1 to 
> count(/items/item))[. != $num]"/>
>     <xsl:with-param name="pSeed" select="$pSeed" as="xs:integer"/>
>      </xsl:call-template>
>   </xsl:variable>
>    <positions>
>    <xsl:sequence select="$x/el[position() &lt; 5]"/>
>    </positions>
>   </item>
>   <xsl:if test="$num &lt; count(/items/item)">
>    <xsl:call-template name="item">
>     <xsl:with-param name="pSeed" select="$pSeed + 11" 
> as="xs:integer"/>
>     <xsl:with-param name="num" select="$num + 1" as="xs:integer"/>
>    </xsl:call-template>
>   </xsl:if>
>  </xsl:template>
> </xsl:stylesheet>
> Cheers,
> Jesper

Current Thread