Using fn:random-number-generator to produce random numbers more than once

Erik Zander

I try to write a simple function to provide me with a random letter each time i call it but I have difficulties combining my idea with the concept of a functional programing approach. Some help along the way would be appreciated! The code I have looks like:

<xd:doc>
        <xd:desc>Provides one random letter, if the type is provided it returns a letter of thet type</xd:desc>
        <xd:param name="type">The type of letter to return, one of (A,a,B,b)</xd:param>
    </xd:doc>
    <xsl:function name="gdpr:randomLetter" as="xs:string">
        <xsl:param name="type" as="xs:string"></xsl:param>
        <xsl:choose>
            <xsl:when test="$type = 'A'">
                <xsl:variable name="randomNumber" select="random-number-generator()['next']?permute(1 to 7)[1]"/>
                <xsl:variable name="letters" select="('A','O','U','E','I','Y','Q')"/>
                <xsl:value-of select="$letters[$randomNumber]"/>
            </xsl:when>
            <xsl:when test="$type = 'a'">
                <xsl:variable name="randomNumber" select="random-number-generator()['next']?permute(1 to 7)[1]"/>
                <xsl:variable name="letters" select="('a','o','u','e','i','y','q')"/>
                <xsl:value-of select="$letters[$randomNumber]"/>
            </xsl:when>
            <xsl:when test="$type = 'B'">
                <xsl:variable name="randomNumber" select="random-number-generator()['next']?permute(1 to 19)[1]"/>
                <xsl:variable name="letters" select="('W','R','T','P','S','D','F','G','H','J','K','L','M','N','B','V','C','X','Z')"/>
                <xsl:value-of select="$letters[$randomNumber]"/>
            </xsl:when>
            <xsl:when test="$type = 'b'">
                <xsl:variable name="randomNumber" select="random-number-generator()['next']?permute(1 to 19)[1]"/>
                <xsl:variable name="letters" select="('w','r','t','p','s','d','f','g','h','j','k','l','m','n','b','v','c','x','z')"/>
                <xsl:value-of select="$letters[$randomNumber]"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:variable name="randomNumber" select="random-number-generator()['next']?permute(1 to 52)[1]"/>
                <xsl:variable name="letters" select="('A','O','U','E','I','Y','Q','a','o','u','e','i','y','q','w','r','t','p','s','d','f','g','h','j','k','l','m','n','b','v','c','x','z','W','R','T','P','S','D','F','G','H','J','K','L','M','N','B','V','C','X','Z')"/>
                <xsl:value-of select="$letters[$randomNumber]"/>
            </xsl:otherwise>
        </xsl:choose>

    </xsl:function>
Michael Kay

Your question encapsulates the problem:

I try to write a simple function to provide me with a random letter each time i call it

But a function that produces different results on different invocations (with the same arguments) is not a true ("pure") function.

One way out of this is to exploit the fact that XSLT already has "impure" functions of a kind: a function that creates a new node returns a different node each time, and you can expose this by using generate-id(). So you could write

<xsl:function name="my:random" as="xs:double">
  <xsl:variable name="dummy"><a/></xsl:variable>
  <xsl:sequence select="fn:random-number-generator(generate-id($dummy))?permute(1 to 10)"/>
</xsl:function>

The only problem with this is that you're right on the boundaries of what's well-defined in the spec and the optimizer might not let you get away with such tricks. It's much better, if you can, to find some way of passing a different argument to the function each time it is called: for example, a sequence number, or generate-id() applied to the input node you are currently processing.

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

Random number generator generating more than specified numbers

Random number generator generating low numbers more frequently than high numbers C++

Random number generator doesn't produce expected numbers within a given range using values from input fields

Javascript random number generator (generates every number once) using input

Random number generator with different numbers

Generating a random number (more than once) and using it inside two class functions

Javascript: Random number generator won't produce random number

Python Random Number Unique number generator before using new numbers

Using a random number generator in MIPS?

How would I prevent a integer from being generated more than once in a random generator

Is there a way to make a random number generator in java that is more likely to land on one number than another?

Random number generator between two numbers - MatLab

Random number generator without repeating numbers

Random Number Generator Generates Same Numbers on Android

Adding Numbers Generated By Random Number Generator in C

How to get random numbers for user ID using Random Number Generator in robot framework

Scala Random Number Generator Not Producing Unique Random Numbers Between A Range

Random number generator in c program is not generating correct random numbers

Random number generator does not produce an expected answer Node JS

Produce a random number in a range using C#

How to create a random number generator using Reactor?

Using Random Number Generator for a Loop Timeout

programmatically using Hardware Random number generator

Random Number Generator using Geometric Distribution

Random Number Generator using C#

Why does rand() produce random number higher than scaling factor?

Why does my Java program not produce a fixed number of random numbers?

Random numbers once a time

Random Number Generator - That Stops