Abstract:
The present invention provides a method and an apparatus for generating sequences of pseudo-random numbers. Seed random sequences are used to establish independent pseudo-random sub-processes. Those independent pseudo-random sub-processes are combined through a technique of successive interaction to create final pseudo-random sequences. One set of pseudo-random sub-processes is used to continually reorder a table of potential output values. The table can contain uniformly distributed values or may contain values distributed in a non-uniform manner. A second set of pseudo-random sub-processes is used to select a sequence of output values from the table. The invention creates final pseudo-random sequences of output values that can be equidistributed over large samples or final pseudo-random sequences of output values that have non-uniform distributions.

Description:
BACKGROUND OF THE INVENTION  
       [0001]     1. Field of the Invention  
         [0002]     The present invention relates generally to a method of and apparatus for generating pseudo-random numbers.  
         [0003]     2. Description of the Prior Art  
         [0004]     Pseudo-random numbers are widely used for a variety of purposes. Sequences of values created by pseudo-random number generators are most useful if they appear to have been generated by random processes. Further, the sequences of values created by pseudo-random number processes should be adequately distributed across the range of potential output values that would have resulted from the intended random process. Ideally, sequences of pseudo-random values should not exhibit discernable patterns or other observable relationships among the output values that would make their deterministic characteristics known.  
         [0005]     Many pseudo-random number generator processes have been created. The linear feedback shift register (LFSR) process is easily implemented and has been widely used but suffers inherent weakness from the strict linearity of its design. Another widely used process is the classic linear congruential generator (LCG). For example, the LCG process is the framework used by DeVane in the high-speed pseudo-random number generator of U.S. Pat. No. 5,187,676, by Finkelstein in the encryption protection in a communication system of U.S. Pat. No. 6,014,446, by Tiedemann et al. in the system for testing a digital communication channel of U.S. Pat. No. 5,802,105, by Ridenour in the high precision pseudo-random number generator of U.S. Pat. No. 5,541,996, and by Shimada in the pseudo-random number generator of U.S. Pat. No. 6,097,815. LCG-based systems can generate well mixed numbers and pass a number of statistical tests. However, the pseudo-random number sequence generated by an LCG process often can be inferred even if the parameters of the process are all unknown.  
         [0006]     The multiple recursive generator (MRG) process extends the range of recursion from the immediately preceding output value of the LCG process to more distantly produced ones. Lagged Fibonacci generators and some combined generators are MRG processes. The LCG process also has been extended to additional dimensions to create a matrix method (MM). Niederreiter introduced the multiple-recursive matrix method (MRMM) as a framework for encompassing essentially all of the linear methods described above as well as several others such as the Generalized Feedback Shift Register (GFSR) and the “twisted” GFSR. An example of the twisted GFSR is the Mersenne Twister described by Matsumoto and Nishimura.  
         [0007]     Another class of pseudo-random generator processes was created by the authors of the current invention and was denoted as a multiple variable recursive matrix (MVRM) process. As described in U.S. patent application Ser. No. 10/646,939 dated Aug. 21, 2003, the new class of MVRM pseudo-random number generator processes is well suited to general-purpose applications and generates output sequences with very long periods and very low predictability.  
         [0008]     All of the previously described pseudo-random generator processes use primarily linear mathematical operations or similar variants to create the pseudo-random output values. In 1965, MacLaren and Marsaglia suggested a non-linear enhancement by using one pseudo-random number sequence to permute the elements of another pseudo-random number sequence. The process was succinctly described by Knuth ( The Art of Computer Programming, Volume  2 , Seminumerical Algorithms , Third Edition, 1997, Addison Wesley, page 34) as randomizing by shuffling and denoted as Algorithm M. Such shuffling can lead to very long sequence periods and appears to attenuate the relationship of initially nearby terms in the output sequence.  
         [0009]     In algorithm M, two pseudo-random number sequences (X n ) and (Y n ) are created by separate initial pseudo-random number generator processes. An auxiliary table V[0], V[1], . . . , V[k−1] is established where k is some number chosen for convenience, usually in the neighborhood of 100. The V-table initially is filled with the first k values of the X-sequence. To generate a final output sequence of pseudo-random number values, the following steps are repeatedly executed: 
        1) The next elements of the (X n ) and (Y n ) sequences are generated;     2) A pointer j is set to an element of the range 0≦j≦k as determined by the most recently generated element of (Y n ) from step 1 through the process j=[kY/m] where Y is the most recently generated value of the (Y n ) sequence, m is the modulus used in the sequence (Y n ) and k is the number chosen as the length of the auxiliary table V;     3) The output value is selected by pointer j from the auxiliary table V to be V[j];     4) The auxiliary table V is updated by replacing the V[j] element with the most recently generated element of (X n ) from step 1.        
 
         [0014]     An alternative shuffling approach that uses a single pseudo-random number sequence to permute the elements of that same pseudo-random number sequence was described by Knuth (page 33) as Algorithm B.  
         [0015]     In algorithm B, a single pseudo-random number sequence (X n ) is created by an initial pseudo-random number generator process. An auxiliary table V[0], V[1], . . . , V[k−1] is established where k is some relatively small number again chosen for convenience. The V-table initially is filled with the first k values of the X-sequence. The variable Y initially is set equal to the (k+1)st value of the X-sequence. To generate a final output sequence of pseudo-random number values, the following steps are repeatedly executed: 
        1) A pointer j is set to an element of the range 0≦j≦k as determined by the variable Y through the process j=[kY/m] where m is the modulus used in the sequence (X n ) and k is the number chosen as the length of the auxiliary table V;     2) The output value is selected by pointer j from the auxiliary table V to be V[j];     3) The variable Y is set to the output value V[j];     4) The next element of the (X n ) sequence is generated;     5) The auxiliary table V is updated by replacing the V[j] element with the most recently generated element of (X n ) from step 4.        
 
         [0021]     Knuth&#39;s example for Algorithm M (page 33) uses an LCG pseudo-random number generator for both the (X n ) and (Y n ) sequences with initial elements of X 1 =5772156649, X 2 =29774336634, X 3 =19657136912, Y 1 =1781072418, Y 2 =23044562359 and Y 3 =471691136 with k=64 and m=34359738368. In the example, the first element of the (X n ) sequence, 5772156649, is chosen by the j pointer as the third output element created by the composite process. Since an LCG pseudo-random number generator will loop through the sequence of all other possible values before returning to any initial value, the (X n ) sequence will be generated to include 2 35  or 34,359,738,368 other values before the value of 5772156649 is once again generated and included in the auxiliary table V. Therefore, once the example version of algorithm M creates any specific output value, that same value cannot be created as any one of at least the next 34 billion output values. Conversely, for a truly random process the probability of any given number occurring at any point in the sequence would be identical to that of it occurring at any other point in the sequence. The probability of a specific number occurring at least once in a truly random (X n ) sequence of 34 billion elements from a potential set of 34,359,738,368 elements would be about 98.953%. Using Knuth&#39;s example for algorithm M, however, once a specific value has occurred, the probability of that same value recurring in the next 34 billion elements is absolutely zero. After the cycle has been fully completed (having generated 34,359,738,368 elements) and the specific value has been generated again in the (X n ) sequence and loaded into the auxiliary table V, that specific value is nearly certain to be included as one of the next 1000 output values. Specifically, were the (Y n ) sequence used to select from the auxiliary table to be completely random (such as a coin toss), the probability of a single item in a list of 64 elements being chosen within 1000 tries is about 99.99999%. Thus, while Algorithm M introduces some shuffling of the (X n ) sequence into the output sequence, Algorithm M does not create the types of probabilities of element occurrences that would be expected of a truly random process.  
         [0022]     Algorithm B suffers from the same fundamental shortcoming as Algorithm M. Once any given value of the (X n ) sequence has been generated and loaded into the auxiliary table V, that value will almost certainly appear in the output stream within the next 1000 elements and then it will not appear again for a very, very long time. Thus, the probabilities of elements occurring in an output stream generated by either Algorithm M or Algorithm B are not representative of those expected from truly random processes, severely limiting their use as pseudo-random number generators in more demanding applications.  
         [0023]     Further, shuffling methods exhibit a characteristic property that is generally understood to be an inherent defect; shuffling methods do not alter any generated values that are included in the potential output table but simply vary the order in which those values are extracted from the table. (Knuth, page 34) Compounding that identified flaw, if the initial pseudo-random number generator processes fail some tests of randomness such as the “birthday spacings” test or the random-walk test, the shuffled sequences also will fare poorly on those tests.  
         [0024]     Most pseudo-random number generators including algorithm M and algorithm B are designed to create uniformly distributed results. For applications that require final sequences of values with specific non-uniform distribution characteristics, the uniformly distributed results from most pseudo-random number generators must be transformed through mathematical manipulations to create output values with the desired distribution characteristics. This transformation is generally a subsequent, additional step in the creation of the pseudo-random number values.  
         [0025]     The invention described herein presents a general, non-linear pseudo-random number generator process offering output sequence element probabilities comparable to those expected of truly random processes. The current invention transforms the perceived weakness of shuffling-type processes into an exceptionally powerful alternative that can create pseudo-random number output sequences capable of passing the “birthday spacings”, random-walk and other known tests even when the underlying pseudo-random number generating components do not. Finally, the current invention introduces a process for creating pseudo-random number output sequences with defined distribution characteristics without the need for secondary processing of the output sequence.  
       SUMMARY AND OBJECTS OF THE INVENTION  
       [0026]     A primary object of the present invention is to provide a method and process for generating pseudo-random numbers with output sequence characteristics comparable to those of truly random processes, capable of producing specifically defined output sequence distribution characteristics and with very long period non-repeating output sequences.  
         [0027]     Another object of the present invention is to introduce a pseudo-random generator process that will pass known tests such as the “birthday spacings” and random-walk tests even when its underlying pseudo-random number generating components do not pass those tests.  
         [0028]     These objects are achieved by introducing a new type of pseudo-random number generator process that significantly extends the current state of the art. The pseudo-random generator process of the instant invention can be denoted as defined-distribution expanded shuffling (DDES) generators. As described in the following sections, the new class of DDES pseudo-random number generators of this invention is well suited to general-purpose applications where the characteristic distribution of the output sequence should satisfy specifically designated distributional properties.  
         [0029]     Distributional characteristics of output sequences created by pseudo-random number generator processes have always been a major concern. Most pseudo-random number generators are designed to create uniformly distributed results. Those results have often been transformed through mathematical manipulations to create final sequences of values with specific non-uniform distributional characteristics. The pseudo-random number generator processes of the current invention can create both uniformly distributed and non-uniformly distributed output sequences without the need for subsequent mathematical augmentation.  
         [0030]     The demonstrable levels of “randomness” also have been a concern in the design of pseudo-random number generators. Many tests have been devised that indicate the “randomness” of a sequence of values generated by a pseudo-random number generator. While passing such tests is no guaranty of acceptable randomness, failure of such tests usually indicates a weakness in the pseudo-random number generator. The pseudo-random number generator processes of the claimed invention create output sequences that satisfy known randomness tests such at the “birthday spacings” and random-walk tests that other pseudo-random number generators, including its underlying pseudo-random number generating components, are known to fail.  
         [0031]     A first version of the defined-distribution expanded shuffling (DDES) pseudo-random number generator of the present invention is similar to Algorithm M in that each uses two pseudo-random number sequences (X n ) and (Y n ) that are created by separate component pseudo-random number generator processes. Unlike Algorithm M, the DDES process of the present invention uses a defined-distribution table D[0], D[1], . . . , D[k+z−1] where k and z are chosen with specific consideration given to the range of values desired in the output sequence; that is, k should be no smaller than the number of possible elements of the output sequence, p, and ideally should be much larger than p, and a is chosen such that (k+z) mod p≡0 where z≧0. The defined-distribution table D initially is filled with (k+z) values satisfying the desired output distribution characteristics as described in a following section. The defined-distribution table D contains all possible values of the entire output sequence at least once and, depending on the desired output distribution, may include some or many values more than once. Output elements are chosen from the defined-distribution table D by a component pseudo-random number generation sequence (Y n ) and elements of the defined-distribution table D are shuffled by application of another component pseudo-random number generation sequence (X n ). The range of possible values in the component pseudo-random number generation sequence (Y n ) is represented by the variable m y  that should ideally satisfy the condition that m y  be equal to or greater than k. The variable m x  represents the range of possible values in the component pseudo-random number generation sequence (X n ) and the value for m x  should ideally satisfy the condition that m x  be equal to or greater than (k+z).  
         [0032]     To generate a final output sequence of pseudo-random number values, the following steps are repeatedly executed: 
        1) The next elements of the (X n ) and (Y n ) sequences are generated;     2) A pointer j is set to an element of the range 0≦j&lt;k as determined by the most recently generated element of (Y n ) from step 1;     3) The output value is selected by pointer j from the defined-distribution table D to be D[j];     4) A pointer h is set to an element of the range 0≦h&lt;(k+z) as determined by the most recently generated element of (X n ) from step 1;     5) The defined-distribution table D is updated by switching the entries for the D[h] and the D[j] elements.        
 
         [0038]     The creation of the pointers h and j are ideally implemented by the following: 
        h=[(k+z)X/m x ] where: 
            X is the most recently generated element of (X n ),     m x , is the range of possible values in the sequence (X n ), and     (k+z) is the number chosen as the length of the defined-distribution table D;    
            j=[kY/m y ] where: 
            Y is the most recently generated element of (Y n ),     m y  is the range of possible values in the sequence (Y n ), and     k is the number chosen as the partial length of the defined-distribution table D.    
               
 
         [0047]     Since h and j are discrete pointers into the defined-distribution table D, each must be an integer value. An alternative formulation of h and j that does not change the fundamental nature of the DDES process is h=X mod (k+z) and j=Y mod k.  
         [0048]     The defined-distribution table D initially is filled with (k+z) values to meet the specifications of the desired output distribution characteristics. For a desired uniform distribution over the range of 0 to p−1, the D table should be filled with (k+z)/p entries of each value from (and including) 0 to p−1. For example, with p set to 256, k set to 1134 and z set to 146, the D table would contain 1280 elements with a uniform distribution over the range of 0 to 255 as specified by p, while the D table would contain five occurrences of each number in that range (five 0s, five 1s, . . . and five 255s).  
         [0049]     The defined-distribution table D may be initially filled with (k+z) values to meet the specifications of virtually any desired output distribution characteristics. For example, the sum of two randomly rolled dice covers a possible range of values from 2 to 12 with a binomial distribution. A full set of possible outcomes is represented by a single 2 and 12 entry, two 3 and 11 entries, three 4 and 10 entries, four 5 and 9 entries, five 6 and 8 entries and six 7 entries for a total of 36 entries. To create a desired distribution representing the sum of two dice, the D table would be filled with (k+z)/p entries where p=36 and (k+z) is an integral multiple of 36. For example, with p set to 36, k set to 729 and z set to 27, the D table would contain 756 elements (that is, 36 times 21) and should be initialized with twenty-one 2s and 12s, forty-two 3s and 11s, . . . and one hundred twenty-six 7s. Because the shuffling processes of the present invention do not change the potential output values but just the order in which they are arranged, any given distribution of values, once loaded into the defined-distribution table D, will be directly reflected in the distribution of the final output values.  
         [0050]     The order of the elements used to initially fill the defined-distribution table D should ideally be rearranged prior to the generation of the output pseudo-random number sequence. A defined-distribution table D initially filled with (k+z) values meeting the requirements of the desired distribution and using an initial (X n ) sequence is rearranged prior to use by repeatedly executing the following steps: 
        1) The next i elements of the (X n ) sequence are generated where i≧2;     2) The pointers h i  are set to elements of the range 0≦h i &lt;(k+z) as determined by the i most recently generated elements of (X n ) from step 1;     3) The defined-distribution table D is updated by shifting the entries through the set of pointers h i  so that D[temp]←D[h 1 ], D[h 1 ]←D[h 2 ], D[h 2 ]←D[h 3 ], . . . D[h i-1 ]←D[h i ] and D[h i]←D[temp].          
 
         [0054]     The creation of the pointers h i  is beneficially implemented by the following:
 
 h   i =[( k+z ) X   i   /m   x ] where:
        X i  is the ith most recently generated element of (X n ),     m x  is the range of possible values in the sequence (X n ) and     (k+z) is the chosen length of the defined-distribution table D.        
 
         [0058]     Since the h i  are discrete pointers into the defined-distribution table D, each must be an integer value. An alternative formulation of h i  that does not change the fundamental nature of the DDES process would be h i =X i  mod (k+z).  
         [0059]     A second version of the defined-distribution expanded shuffling (DDES) pseudo-random number generator of the present invention also uses two pseudo-random number sequences (X n ) and (Y n ) that are created by separate component pseudo-random number generator processes. For the second version of DDES, a defined-distribution table D[0], D[1], . . . , D[k+z−1] is established where, as before, k and z are chosen with specific consideration given to the range of values desired in the output sequence; that is, k should be no smaller than the number of possible elements of the output sequence, p, and ideally should be much larger than p, and z is chosen such that (k+z) mod p≡0 where z≧0. The defined-distribution table D initially is filled with (k+z) values as previously described. The defined-distribution table D contains all possible values of the entire output sequence at least once and, depending on the desired output distribution, may include some or many values more than once. As before, output elements are chosen from the defined-distribution table D by a component pseudo-random number generation sequence (Y n ) and elements of the defined-distribution table D are shuffled by application of another component pseudo-random number generation sequence (X n ). The range of possible values in the component pseudo-random number generation sequence (Y n ) is represented by the variable m y  that should ideally satisfy the condition that m y  be equal to or greater than k. The variable m x  represents the range of possible values in the component pseudo-random number generation sequence (X n ) and the value for m x  should ideally satisfy the condition that m x  be equal to or greater than (k+z).  
         [0060]     To generate a final output sequence of pseudo-random number values, the following steps are repeatedly executed: 
        1) The next element of the (Y n ) sequence and the next i elements of the (X n ) sequence are generated where i≧2;     2) The pointer j is set to an element of the range 0≦j≧k as determined by the most recently generated element of (Y n ) from step 1;     3) The output value is selected by pointer j from the defined-distribution table D to be D[j];     4) The pointers h i  are set to elements of the range 0≦h i &lt;(k+z) as determined by the i most recently generated elements of (X n ) from step 1;     5) The defined-distribution table D is updated by shifting the entries through the set of pointers h i  so that D[temp]←D[h i ], D[h i ]←D[h 2 ], D[h 2 ]←D[h 3 ], . . . D[h i-1 ]←D[h i ] and D[h i ]←D[temp].        
 
         [0066]     The creation of the pointers h i  and j is beneficially implemented by the following: 
        h i =[(k+z)X i /m x ] where: 
            X i  is the ith most recently generated element of (X n ),     m x , is the range of possible values in the sequence (X n ) and     (k+z) is the chosen length of the defined-distribution table D;    
            j=[kY/m y ] where: 
            Y is the most recently generated element of (Y n ),     m y  is the range of possible values in the sequence (Y n ), and     k is the number chosen as the partial length of the defined-distribution table D.    
               
 
         [0075]     Since the h i  and j are discrete pointers into the defined-distribution table D, each must be an integer value. An alternative formulation of h i  and j that does not change the fundamental nature of the DDES process would be h i =X i  mod (k+z) and j=Y mod k.  
         [0076]     Without loss of generality and identical in concept to the second version of the DDES process described above, the ith most recently generated elements of (X n ) could be replaced with the single most recently generated elements of i separate component pseudo-random number generation sequences (Xi n ).  
         [0077]     A third version of the defined-distribution expanded shuffling (DDES) pseudo-random number generator of the present invention is similar to Algorithm B in that each uses a single pseudo-random number sequence (Y n ) that is created by a separate component pseudo-random number generator process. Unlike Algorithm B, the DDES process of the present invention uses a defined-distribution table D[0], D[1], . . . , D[k+z−1] where k and z are chosen with specific consideration given to the range of values desired in the output sequence; that is, k should be no smaller than the number of possible elements of the output sequence, p, and ideally should be much larger than p, and z is chosen such that (k+z) mod p≡0 where z≧0. The defined-distribution table D initially is filled with (k+z) values satisfying the desired output distribution characteristics as described above. The defined-distribution table D contains all possible values of the entire output sequence at least once and, depending on the desired output distribution, may include some or many values more than once. Output elements are chosen from the defined-distribution table D by a component pseudo-random number generation sequence (Y n ). Also unlike Algorithm B, the DDES process does not create additional pointers from the output elements since the range of elements in the output sequence may be much smaller than the size of the defined-distribution table D. Instead, elements of the defined-distribution table D are shuffled by application of the current and prior elements of the single component pseudo-random number generation sequence (Y n ). The range of possible values in the component pseudo-random number generation sequence (Y n ) is represented by the variable m y  that should ideally satisfy the condition that m y  be equal to or greater than k.  
         [0078]     To generate a final output sequence of pseudo-random number values, the following steps are repeatedly executed: 
        1) The next element of the (Y n ) sequence is generated;     2) The pointer j is set to an element of the range 0≦j&lt;k as determined by the most recently generated element of (Y n ) from step 1;     3) The output value is selected by pointer j from the defined-distribution table D to be D[j];     4) The pointers h i  are set to elements of the range 0≦h i &lt;(k+z) as determined by the ith prior generated element of (Y n ) from step 1;     5) The defined-distribution table D is updated by shifting the entries through the set of pointers h i  so that D[temp]←D[h 1 ], D[h 1 ]←D[h 2 ], D[h 2 ]←D[h 3 ], . . . D[h i-1 ]←D[h i ] and D[h i ]←D[temp].        
 
         [0084]     The creation of the pointers h i  and j is beneficially implemented by the following: 
        h i =[(k+z)Y i /m x ] where: 
            Y i  is the ith prior generated element of (Y n ),     m y  is the range of possible values in the sequence (Y n ) and     (k+z) is the chosen length of the defined-distribution table D;    
            j=[kY/m y ] where: 
            Y is the most recently generated element of (Y n ),     m y  is the range of possible values in the sequence (Y n ) and     k is the number chosen as the partial length of the defined-distribution table D.    
               
 
         [0093]     Since all the h i  and j are discrete pointers into the defined-distribution table D, each must be an integer value. An alternative formulation of h i  and j that does not change the fundamental nature of the DDES process is h i =Y i  mod (k+z) and j=Y mod k.  
         [0094]     Alternatively, because the h i  pointers of step 4 are all derived from the same component pseudo-random number generation sequence (Y n ), the pointers h i  could be set to elements of the range 0≦h i &lt;(k+z) as determined by an ith number of prior generated elements of (Y n ) from step 1 that were not in immediately preceding order. For instance, the h 1  pointer could be the second preceding element of (Y n ), the h 2  pointer could be the fifth preceding element of (Y n ), the h 3  pointer could be the eleventh preceding element of (Y n ), etc. so that successive applications of step 5 would result in a wider variety of elements being rearranged.  
         [0095]     A key innovation of the present invention is the introduction of the defined-distribution table D; the values contained therein, once established, remain unchanged through the subsequent operation of the pseudo-random number generator. Conventional wisdom considers the failure of shuffling methods to introduce different values into the output sequence as an inherent defect. However, the current invention uses this “defect” of shuffling methods to create a process with distinct advantages. The shuffling processes of the present invention do not change the possible output values but just alter the order in which they are arranged in the defined-distribution table D. Through the selection of elements from the defined-distribution table D, any arbitrary distribution of values, once loaded into table D, will be directly reflected in the distribution of the final output values.  
         [0096]     Another key innovation of the present invention is the introduction of the distinctive condition that k, the length of the defined-distribution table D, must be chosen to be equal to or greater than p, the number of possible elements in the output sequence. This condition is dramatically different from those of Algorithm M and Algorithm B. In those processes, the auxiliary table V contains a very small fraction of the possible output values—less than 0.0000003% of them. By contrast, the specifications of the current invention require that defined-distribution table D contain at least 100% of the possible output values. Ideally, each possible output value would be represented multiple times in the defined-distribution table D by choosing a value of k that is many times larger than p, the number of possible output values. Large values of k would create conditions for which the recurrence of any item in the output stream would not necessarily refer to the same element in the D, relaxing what would otherwise be more stringent requirements for the selection process (driven by a separate component pseudo-random number generator) in order to produce suitably “random” results. Ultimately, this feature of the claimed process results in a series of generated numbers that suitably reflect the characteristics of a truly randomly generated set of numbers.  
         [0097]     A final key innovation of the present invention is the introduction of greatly expanded shuffling for the defined-distribution table D, using multiple outputs from a single component pseudo-random number generator or single outputs from multiple, separate component pseudo-random number generators for every round of pseudo-random number generation. This extended shuffling could be expanded to the extent that virtually every item in the defined-distribution table D was shuffled before every new selection from the table. The greatly expanded shuffling also would relax what would otherwise be more stringent requirements for the component pseudo-random number selection process in order to produce suitably “random” results.  
         [0098]     The DDES pseudo-random number generators of this invention effectively incorporate component pseudo-random number generator processes into the generation of the final pseudo-random number output sequence. The component pseudo-random number generator processes can be designed from any of a number of well-known alternatives including the linear congruential, multiple recursive, matrix method, multiple-recursive matrix method or the multiple variable recursive matrix processes previously described. The output from the DDES pseudo-random number generators of this invention could be used as separate component pseudo-random number generators for another DDES process. Many of these component pseudo-random number generator processes can be created to generate exceptionally long cycle lengths (the number of periods before the generator begins to repeat its output sequence). Through the combination of long-period shuffling and long-period selection sequences, the DDES pseudo-random number generators of this invention yield even substantially longer final output sequence periods. For even single component pseudo-random number generators such as the third version of the DDES process described above, the final output sequence periods may be much longer than the length of the component sequence period because the defined-distribution table D does not necessarily return to its original status when the selection sequence does. Finally, when multiple component pseudo-random number generators are used, ideally the component sequence period lengths should ideally be chosen to be distinct; that is, no component sequence period length should be the same as another. Often, the length of the composite final output sequence created by the combined component sequences has a cycle length much greater than the product of all the component sequence lengths because the defined-distribution table D does not necessarily return to its original status when the component sequences do. 
     
    
     BRIEF DESCRIPTION OF THE DRAWINGS  
       [0099]      FIG. 1  is a block diagram depicting the functional components and sequential operation of the defined-distribution expanded shuffling (DDES) pseudo-random number generator, according to the invention claimed herein.  
         [0100]      FIG. 2  is a block diagram depicting the general initialization process for the defined-distribution table D of the DDES pseudo-random number generator, according to the invention claimed herein.  
         [0101]      FIG. 3  is a block diagram depicting the functional components and sequential operation of the DDES pseudo-random number generator with a single output pointer from the component pseudo-random number generator Y and a single shift pointer from the component pseudo-random number generator X for each step of the process, according to the invention claimed herein.  
         [0102]      FIG. 4  is a block diagram depicting the functional components and sequential operation of the DDES pseudo-random number generator with a single output pointer from the component pseudo-random number generator Y and multiple shift pointers from the component pseudo-random number generator X for each step of the process, according to the invention claimed herein.  
         [0103]      FIG. 5  is a block diagram depicting the functional components and sequential operation of the DDES pseudo-random number generator with a single output pointer from the component pseudo-random number generator Y and multiple shift pointers from the same component pseudo-random number generator Y for each step of the process, according to the invention claimed herein.  
         [0104]      FIG. 6  is a block diagram depicting an example of the sequential operation of the functional components of the DDES pseudo-random number generator with a single output pointer from a component pseudo-random number generator Y with specified elements [ 255 ,  121 ,  423 ,  335 ] and multiple shift pointers from a component pseudo-random number generator X with initial specified elements [ 144 ,  321 ,  372 ,  235 ,  364 ;  258 ,  447 ,  362 ,  172 ,  465 ;  64 ,  386 ,  208 ,  107 ,  17 ] for each step of the process, according to the invention claimed herein. 
     
    
     DESCRIPTION OF THE PREFERRED EMBODIMENT  
       [0105]     Referring to  FIG. 1 , a block diagram of the defined-distribution expanded shuffling (DDES) pseudo-random number generator system of the claimed invention is shown that incorporates an initialized defined-distribution table  13 , a first element from a component pseudo-random number generator Y  11 , a first output pointer j  12 , a selected first output element  14 , a first (set of) element(s) from a component pseudo-random number generator X  15 , a first (set of) shift pointer(s) h  16 , and a first rearranged defined-distribution table  23 . Generation of subsequent rounds of output elements are represented by a second element from a component pseudo-random number generator Y  21 , a second output pointer j  22 , a selected second output element  24 , a second (set of) element(s) from a component pseudo-random number generator X  25 , a second (set of) shift pointer(s) h  26 , and a second rearranged defined-distribution table  33 ; and eventually by an n th  (set of) element(s) from a component pseudo-random number generator X  35 , an n th  (set of) shift pointer(s) h  36 , an n th  rearranged defined-distribution table  43 , an n+1 th  element from a component pseudo-random number generator Y  41 , an n+1 th  output pointer j  42 , and an n+1 th  selected output element  44 .  
         [0106]     The initialized defined-distribution table  13  consists of a user-specified set of possible output values that have been initialized by the process shown in  FIG. 2 . In that process, the chosen, specified set of possible output values are loaded into an initial defined-distribution table and rearranged for a specified number of cycles to create the initialized defined-distribution table ( 13  in  FIG. 2 ). The first element from the component pseudo-random number generator Y  11  is generated by an independent pseudo-random number generator process beneficially consisting of virtually any type of pseudo-random number generator process established with specified seed values. The first output pointer j  12  is created from the first element from the component pseudo-random number generator Y  11 . A variety of processes may be used to create the first output pointer j  12 , such as using a multiplicative assignment kY/m y  where m y  is the modulus used in the component pseudo-random number generator Y or, more generally, where m y  is simply the range of values created by the component pseudo-random number generator Y, k is a number chosen to be smaller than the size of the initialized defined-distribution table  13  and represents the selectable portion of the initialized defined-distribution table  13  and m y  should ideally satisfy the condition that m y  is equal to or greater than k. Alternatively, the first output pointer j  12  is created from the first element from the component pseudo-random number generator Y  11  using a modular reduction assignment Y mod k or from any other process that maps the values of the range of elements of the series Y generated by the component pseudo-random number generator onto the range k of the selectable portion of the initialized defined-distribution table  13 . The first output element  14  of the DDES pseudo-random number generator system of the claimed invention is the element of the initialized defined-distribution table  13  selected by the first output pointer j  12 . The first (set of) element(s) from the component pseudo-random number generator X  15  is generated by an independent pseudo-random number generator process beneficially consisting of a set of initialization cycles of virtually any type of pseudo-random number generator process established with specified seed values. The first (set of) shift pointer(s) h  16  is created from the first (set of) element(s) from the component pseudo-random number generator X  15 , using any of a number of possible processes. For example, the first set of shift pointers h  16  can be created using a multiplicative assignment (k+z)X/m x  where m x  is the modulus used in the component pseudo-random number generator X or, more generally, where m x  is simply the range of values created by the component pseudo-random number generator X, z is the number chosen such that (k+z) is the size of the entire initialized defined-distribution table  13  and m x  should ideally satisfy the condition that m x  is equal to or greater than (k+z). Alternatively, the first (set of) shift pointer(s) h  16  is created from the first (set of) element(s) from the component pseudo-random number generator X  15  using a modular reduction assignment X mod (k+z) or from any other process that maps the values of the range of elements of the series X generated by the component pseudo-random number generator onto the range (k+z) of the entire initialized defined-distribution table  13 . The first rearranged defined-distribution table  23  can conveniently be created from the initialized defined-distribution table  13  by rearranging the positions of elements in the initialized defined-distribution table  13  using the first (set of) shift pointer(s) h  16  separately from or in conjunction with the first and/or previous (set of) output pointer(s) j  12  created from the component pseudo-random number generator Y.  
         [0107]     The rearranged defined-distribution table  23  created from the first cycle of the pseudo-random number generator system of the claimed invention consists of the same specified set of possible output values that was present in the initialized defined-distribution table  13 . The second element from the component pseudo-random number generator Y  21  is generated by the next cycle of the independent pseudo-random number generator process Y. The second output pointer j  22  can conveniently be created from the second element from the component pseudo-random number generator Y  21  using a multiplicative assignment, modular reduction assignment or other mapping assignment process from the range of elements of the series Y generated by the component pseudo-random number generator onto the range k of the selectable portion of the rearranged defined-distribution table  23 . The second output element  24  of the DDES pseudo-random number generator system of the claimed invention is the element of the rearranged defined-distribution table  23  selected by the second output pointer j  22 . The second (set of) element(s) from the component pseudo-random number generator X  25  is generated by the next cycle of the independent pseudo-random number generator process X. The second (set of) shift pointer(s) h  26  can beneficially be created from the second (set of) element(s) from the component pseudo-random number generator X  25  using a multiplicative assignment, modular reduction assignment or other mapping assignment process from the range of elements of the series X generated by the component pseudo-random number generator onto the range (k+z) of the entire rearranged defined-distribution table  23 . The second rearranged defined-distribution table  33  is created from the first rearranged defined-distribution table  23  by rearranging the positions of elements in the first rearranged defined-distribution table  23  using the second (set of) shift pointer(s) h  26  separately from or in conjunction with the second and/or previous (set of) output pointer(s) j  22  created from the component pseudo-random number generator Y.  
         [0108]     Subsequent cycles of operation of the pseudo-random number generator system of the claimed invention are shown in  FIG. 1  as the n+1 th  cycle where the nth rearranged defined-distribution table  43  is created from the prior rearranged defined-distribution table using the n th  (set of) element(s) from the component pseudo-random number generator X  35  to create the resulting n th  (set of) shift pointer(s) h  36 . Alternatively, as shown in  FIG. 5 , the n th  and/or (set of) previous output pointer(s) j  22 ,  12  created from the component pseudo-random number generator Y can be used to rearrange the positions of elements in the n−1 th  rearranged defined-distribution table and create the n th  rearranged defined-distribution table  43 . The n+1 th  element from the component pseudo-random number generator Y  41  is generated by the next cycle of the independent pseudo-random number generator process Y from which the n+1 th  output pointer j  42  is created. The n+1 th  output element  44  of the DDES pseudo-random number generator system of the claimed invention is the element of the n th  rearranged defined-distribution table  43  selected by the n+1 th  output pointer j  42 .  
         [0109]     In  FIG. 2 , a general initialization process for the defined-distribution table D of the claimed invention is shown that incorporates an initial defined-distribution table  111 , a first set of elements from a component pseudo-random number generator X  112 , a first set of shift pointers h  113 , and a first rearranged defined-distribution table  121 . Subsequent rounds initializing the defined-distribution table  13  are represented by a second set of elements from a component pseudo-random number generator X  122 , a second set of shift pointers h  123 , and a second rearranged defined-distribution table  131 ; and eventually by an n th  set of elements from a component pseudo-random number generator X  132 , an n th  set of shift pointers h  133 , and an n th  rearranged defined-distribution table that becomes the fully initialized defined-distribution table  13  that is used in  FIGS. 1 and 3 - 5 .  
         [0110]     The initial defined-distribution table  111  conveniently consists of a user-specified set of possible output values chosen to exhibit desired distribution characteristics that is loaded into an initial defined-distribution table  111 . The first set of elements from the component pseudo-random number generator X  112  is generated by an independent pseudo-random number generator process beneficially consisting of a set of initialization cycles of virtually any type of pseudo-random number generator process established with specified seed values. The first set of shift pointers h  113  may be created from the set of first elements from the component pseudo-random number generator X  112  using a multiplicative assignment (k+z)X/m x  where m x  is the modulus used in the component pseudo-random number generator X or, more generally, where m x  is simply the range of values created by the component pseudo-random number generator X, z is the number chosen such that (k+z) is the size of the entire defined-distribution table  111  and m, should ideally satisfy the condition that m x  is equal to or greater than (k+z). Alternatively, the first set of shift pointers h  113  may be created from the first elements from the component pseudo-random number generator X  112  using a modular reduction assignment X mod (k+z) or from any other process that maps the values of the range of elements of the series X generated by the component pseudo-random number generator onto the range (k+z) of the entire initial defined-distribution table  111 . The first rearranged defined-distribution table  121  is created from the initial defined-distribution table  111  by rearranging the positions of elements in the initial defined-distribution table  111  using the first set of shift pointers h  113 .  
         [0111]     The first rearranged defined-distribution table  121  shown in  FIG. 2  created from the first cycle of the defined-distribution table initialization process consists of the same specified set of possible output values that had been loaded into the initial defined-distribution table  111 . The second set of elements from the component pseudo-random number generator X  122  is generated by the next cycle of the independent pseudo-random number generator process X. The second set of shift pointers h  123  may be conveniently created from the second set of elements from the component pseudo-random number generator X  122  using multiplicative assignment, modular reduction assignment or other mapping assignment process from the range of elements of the series X generated by the component pseudo-random number generator onto the range (k+z) of the entire rearranged defined-distribution table  121 . The second rearranged defined-distribution table  131  is conveniently created from the first rearranged defined-distribution table  121  by rearranging the positions of elements in the first rearranged defined-distribution table  121  using the second set of shift pointers h  123 .  
         [0112]     Subsequent cycles of operation of the defined-distribution table initialization process are shown as the n th  cycle where the n th  rearranged defined-distribution table  13  is created from the prior rearranged defined-distribution table using the n th  set of elements from the component pseudo-random number generator X  132  and the resulting n th  set of shift pointers h  133  by rearranging the positions of elements in the n−1 th  rearranged defined-distribution table. At the conclusion of n initialization cycles, the n th  rearranged defined-distribution table  13  becomes the fully initialized defined-distribution table for the operation of the pseudo-random number generator system of the claimed invention as shown in  FIGS. 1 and 3 - 5 .  
         [0113]     In  FIG. 3 , one alternative embodiment of the defined-distribution expanded shuffling (DDES) pseudo-random number generator system of the claimed invention is shown that incorporates an initialized defined-distribution table  13 , a first element from a component pseudo-random number generator Y 1    11 , a first output pointer j 1    12 , a selected first output element D j1    14 , a first element from a component pseudo-random number generator X 1    15 , a first shift pointer h 1    16 , and a first rearranged defined-distribution table  23 . Generation of subsequent rounds of output elements are represented by a second element from a component pseudo-random number generator Y 2    21 , a second output pointer j 2    22 , a selected second output element D j2    24 , a second element from a component pseudo-random number generator X 2    25 , a second shift pointer h 2    26 , and a second rearranged defined-distribution table  33 . Ultimately the process results in an n th  element from a component pseudo-random number generator X n    35 , an n th  shift pointer h n    36 , an n th  rearranged defined-distribution table  43 , an n+1 th  element from a component pseudo-random number generator Y n+1    41 , an n+1 th  output pointer j n+1    42 , and an n+1 th  selected output element D jn+1    44 .  
         [0114]     In the embodiment shown in  FIG. 3 , the initialized defined-distribution table  13  consists of a user-specified set of possible output values that have been initialized by the process shown in  FIG. 2 . In that process, the chosen, specified set of possible output values are loaded into an initial defined-distribution table  111  and rearranged for a specified number of cycles to create the initialized defined-distribution table ( 13  in  FIG. 2 ). The first element from the component pseudo-random number generator Y 1    11  is generated by an independent pseudo-random number generator process beneficially consisting of a set of initialization cycles of virtually any type of pseudo-random number generator process established with specified seed values. The first output pointer j 1    12  can be created from the first element from the component pseudo-random number generator Y 1    11  using a multiplicative assignment kY 1 /m y  where m y  is the modulus used in the component pseudo-random number generator Y or, more generally, where m y  is simply the range of values created by the component pseudo-random number generator Y, k is the number chosen to be smaller than the size of the initialized defined-distribution table  13  and represents the selectable portion of the initialized defined-distribution table  13  and m y  should ideally satisfy the condition that m y  is equal to or greater than k. Alternatively, the first output pointer j 1    12  is created from the first element from the component pseudo-random number generator Y 1    11  using a modular reduction assignment Y 1  mod k or from any other process that maps the values of the range of elements of the series Y generated by the component pseudo-random number generator onto the range k of the selectable portion of the initialized defined-distribution table  13 . The first output element D j1    14  of the DDES pseudo-random number generator system of the claimed invention is the element of the initialized defined-distribution table  13  selected by the first output pointer j 1    12 . The first element from the component pseudo-random number generator X 1    15  is generated by an independent pseudo-random number generator process advantageously consisting of a set of initialization cycles of virtually any type of pseudo-random number generator process established with specified seed values. The first shift pointer h 1    16  may be created from the first element from the component pseudo-random number generator X 1    15  using a multiplicative assignment (k+z)X 1 /m x  where m x  is the modulus used in the component pseudo-random number generator X or, more generally, where m x  is simply the range of values created by the component pseudo-random number generator X, z is the number chosen such that (k+z) is the size of the entire initialized defined-distribution table  13  and m x  should ideally satisfy the condition that m x  is equal to or greater than (k+z). Alternatively, the first shift pointer h 1    16  is created from the first element from the component pseudo-random number generator X 1    15  using a modular reduction assignment X 1  mod (k+z) or from any other process that maps the values of the range of elements of the series X generated by the component pseudo-random number generator onto the range (k+z) of the entire initialized defined-distribution table  13 . In the embodiment of the process shown in  FIG. 3 , the first rearranged defined-distribution table  23  is created from the initialized defined-distribution table  13  by switching the positions of elements in the initialized defined-distribution table  13  using the first shift pointer h 1    16  and the first output pointer j 1    12  created from the first element from the component pseudo-random number generator Y 1    11 .  
         [0115]     For the embodiment shown in  FIG. 3 , the rearranged defined-distribution table  23  created from the first cycle of the pseudo-random number generator system of the claimed invention consists of the same specified set of possible output values that had been present in the initialized defined-distribution table  13 . The second element from the component pseudo-random number generator Y 2    21  is generated by the next cycle of the independent pseudo-random number generator process Y. The second output pointer j 2    22  may advantageously be created from the second element from the component pseudo-random number generator Y 2    21  using a multiplicative assignment, modular reduction assignment or other mapping assignment process from the range of elements of the series Y generated by the component pseudo-random number generator onto the range k of the selectable portion of the rearranged defined-distribution table  23 . The second output element D j2    24  of the DDES pseudo-random number generator system of the claimed invention is the element of the rearranged defined-distribution table  23  selected by the second output pointer j 2    22 . The second element from the component pseudo-random number generator X 2    25  is generated by the next cycle of the independent pseudo-random number generator process X. The second shift pointer h 2    26  may conveniently be created from the second element from the component pseudo-random number generator X 2    25  using a multiplicative assignment, modular reduction assignment or other mapping assignment process from the range of elements of the series X generated by the component pseudo-random number generator onto the range (k+z) of the entire rearranged defined-distribution table  23 . The second rearranged defined-distribution table  33  is created from the first rearranged defined-distribution table  23  by switching the positions of elements in the first rearranged defined-distribution table  23  using the second shift pointer h 2    26  and the second output pointer j 2    22  created from the second element from the component pseudo-random number generator Y 2    21 .  
         [0116]     Subsequent cycles of operation of the embodiment of the pseudo-random number generator system of the claimed invention as shown in  FIG. 3  are shown as the n+1 th  cycle where the n th  rearranged defined-distribution table  43  is created from the prior rearranged defined-distribution table using the n th  element from the component pseudo-random number generator X n    35  to create the resulting n th  shift pointer h n    36  and the n th  output pointer j n  (not shown) created from the n th  element from the component pseudo-random number generator Y n  (not shown), by rearranging the positions of elements in the n−1 th  rearranged defined-distribution table. The n+1 th  element from the component pseudo-random number generator Y n+1    41  is generated by the next cycle of the independent pseudo-random number generator process Y from which the n+1 th  output pointer j n+1    42  is created. The n+1 th  output element D jn+1    44  of the DDES pseudo-random number generator system of the claimed invention is the element of the n th  rearranged defined-distribution table  43  selected by the n+1 th  output pointer j n+1    42 . In this manner, a series of pseudo-random numbers D j1    14 , D j2    24 , . . . D jn+1    44  is generated.  
         [0117]     In  FIG. 4 , an alternative embodiment of the defined-distribution expanded shuffling (DDES) pseudo-random number generator system of the claimed invention is shown that incorporates an initialized defined-distribution table  13 , a first element from a component pseudo-random number generator Y 1    11 , a first output pointer j 1    12 , a selected first output element D j1    14 , a first set of elements from a component pseudo-random number generator X 1,a , X 1,b , X 1,c  . . . X 1,i    15 , a first set of shift pointers h 1,a , h 1,b , h 1,c  . . . h 1,i    16 , and a first rearranged defined-distribution table  23 . Generation of subsequent rounds of output elements are represented by a second element from a component pseudo-random number generator Y 2    21 , a second output pointer j 2    22 , a selected second output element D j2    24 , a second set of elements from a component pseudo-random number generator X 2,a , X 2,b , X 2,c  . . . X 2,i    25 , a second set of shift pointers h 2,a , h 2,b , h 2,c  . . . h 2,i    26 , and a second rearranged defined-distribution table  33 . Ultimately the process results in an n th  set of elements from a component pseudo-random number generator X n,a , X n,b , X n,c  . . . X n,i    35 , an n th  set of shift pointers h n,a , h n,b , h n,c  . . . h n,i    36 , an n th  rearranged defined-distribution table  43  an n+1 th  element from a component pseudo-random number generator Y n+1    41 , an n+1 th  output pointer j n+1    42 , and an n+1 th  selected output element D jn+1    44 .  
         [0118]     In the embodiment shown in  FIG. 4 , the initialized defined-distribution table  13  consists of a user-specified set of possible output values that have been initialized by the process shown in  FIG. 2 . In that process, the chosen, specified set of possible output values are loaded into an initial defined-distribution table  111  and rearranged for a specified number of cycles to create the initialized defined-distribution table ( 13  in  FIG. 2 ). The first element from the component pseudo-random number generator Y 1    11  is generated by an independent pseudo-random number generator process beneficially consisting of a set of initialization cycles of virtually any type of pseudo-random number generator process established with specified seed values. The first output pointer j 1    12  may be created from the first element from the component pseudo-random number generator Y 1    11  using a multiplicative assignment kY 1 /m y  where m y  is the modulus used in the component pseudo-random number generator Y or, more generally, where m y  is simply the range of values created by the component pseudo-random number generator Y, k is the number chosen to be smaller than the size of the initialized defined-distribution table  13  and represents the selectable portion of the initialized defined-distribution table  13  and m y  should ideally satisfy the condition that m y  is equal to or greater than k. Alternatively, the first output pointer j 1    12  may be created from the first element from the component pseudo-random number generator Y 1    11  using a modular reduction assignment Y 1  mod k or from any other process that maps the values of the range of elements of the series Y generated by the component pseudo-random number generator onto the range k of the selectable portion of the initialized defined-distribution table  13 . The first output element D j1    14  of the DDES pseudo-random number generator system of the claimed invention is the element of the initialized defined-distribution table  13  selected by the first output pointer j 1    12 . The first set of elements from the component pseudo-random number generator X 1,a , X 1,b , X 1,c  . . . X 1,i    15  is generated by an independent pseudo-random number generator process conveniently consisting of a set of initialization cycles of virtually any type of pseudo-random number generator process established with specified seed values. The first set of shift pointers h 1,a , h 1,b , h 1,c  . . . h 1,i    16  may be created from the first set of elements from the component pseudo-random number generator X 1,a , X 1,b , X 1,c  . . . X 1,i    15  using a multiplicative assignment (k+z)[X 1,a , X 1,b , X 1,c  . . . X 1,i ]/m x  where m x  is the modulus used in the component pseudo-random number generator X or, more generally, where m x  is simply the range of values created by the component pseudo-random number generator X, z is the number chosen such that (k+z) is the size of the entire initialized defined-distribution table  13  and m x  should ideally satisfy the condition that m x  is equal to or greater than (k+z). Alternatively, the first set of shift pointers h 1,a , h 1,b , h 1,c  . . . h 1,i    16  may be created from the first set of elements from the component pseudo-random number generator X 1,a , X 1,b , X 1,c  . . . X 1,i    15  using a modular reduction assignment [X 1,a , X 1,b , X 1,c  . . . X 1,i ] mod (k+z) or from any other process that maps the values of the range of elements of the series X generated by the component pseudo-random number generator onto the range (k+z) of the entire initialized defined-distribution table  13 . The first rearranged defined-distribution table  23  is created from the initialized defined-distribution table  13  by switching the positions of elements in the initialized defined-distribution table  13  using the first set of shift pointers h 1,a , h 1,b , h 1,c  . . . h 1,i    16  separately from or in conjunction with the first output pointer j 1    12  created from the first element from the component pseudo-random number generator Y 1    11 .  
         [0119]     For the embodiment shown in  FIG. 4 , the rearranged defined-distribution table  23  created from the first cycle of the pseudo-random number generator system of the claimed invention consists of the same specified set of possible output values that had been present in the initialized defined-distribution table  13 . The second element from the component pseudo-random number generator Y 2    21  is generated by the next cycle of the independent pseudo-random number generator process Y. The second output pointer j 2    22  can beneficially be created from the second element from the component pseudo-random number generator Y 2    21  using a multiplicative assignment, modular reduction assignment or other mapping assignment process from the range of elements of the series Y generated by the component pseudo-random number generator onto the range k of the selectable portion of the rearranged defined-distribution table  23 . The second output element D j2    24  of the DDES pseudo-random number generator system of the claimed invention is the element of the rearranged defined-distribution table  23  selected by the second output pointer j 2    22 . The second set of elements from the component pseudo-random number generator X 2,a , X 2,b , X 2,c  . . . X 2,i    25  is generated by the next cycle of the independent pseudo-random number generator process X. The second set of shift pointers h 2,a , h 2,b , h 2,c  . . . h 2,i    26  can advantageously be created from the second set of elements from the component pseudo-random number generator X 2,a , X 2,b , X 2,c  . . . X 2,i    25  using a multiplicative assignment, modular reduction assignment or other mapping assignment process from the range of elements of the series X generated by the component pseudo-random number generator onto the range (k+z) of the entire rearranged defined-distribution table  23 . The second rearranged defined-distribution table  33  is created from the first rearranged defined-distribution table  23  by switching the positions of elements in the first rearranged defined-distribution table  23  using the second set of shift pointers h 2,a , h 2,b , h 2,c  . . . h 2,i    26  separately from or in conjunction with the second output pointer j 2    22  created from the second element from the component pseudo-random number generator Y 2    21 .  
         [0120]     Subsequent cycles of operation of the embodiment of the pseudo-random number generator system of the claimed invention as shown in  FIG. 4  are shown as the n+1 th  cycle where the n th  rearranged defined-distribution table  43  is created from the prior rearranged defined-distribution table using the n th  set of elements from the component pseudo-random number generator X n,a , X n,b , X n,c  . . . X n,i    35  to create the resulting n th  set of shift pointers h n,a , h n,b , h n,c  . . . h n,i    36  separately from or in conjunction with the n th  output pointer j n  (not shown) created from the n th  element from the component pseudo-random number generator Y n  (not shown), by rearranging the positions of elements in the n−1 th  rearranged defined-distribution table. The n+1 th  element from the component pseudo-random number generator Y n+1    41  is generated by the next cycle of the independent pseudo-random number generator process Y from which the n+1 th  output pointer j n+1    42  is created. The n+1 th  output element D jn+1    44  of the DDES pseudo-random number generator system of the claimed invention is the element of the n th  rearranged defined-distribution table  43  selected by the n+1 th  output pointer j n+1    42 . In this manner, a series of pseudo-random numbers D j1    14 , D j2    24 , . . . D jn+1    44  is generated.  
         [0121]     Another alternative embodiment of the defined-distribution expanded shuffling (DDES) pseudo-random number generator system of the claimed invention as shown in  FIG. 4  uses sequential elements from a set of distinct component pseudo-random number generators instead of sequential sets of elements from a single component pseudo-random number generator. This alternative embodiment uses i separate first elements X 1,a , X 1,b , X 1,c  . . . X 1,i    15  from distinct component pseudo-random number generators X a , X b , X c  . . . X i  to generate the first set of shift pointers h 1,a , h 1,b , h 1,c  . . . h 1,i    16 , the second set of shift pointers h 2,a , h 2,b , h 2,c  . . . h 2,i    26  being generated from the second elements X 2,a , X 2,b , X 2,c  . . . X 2,i    25  from the component pseudo-random number generators X a , X b , X c  . . . X i , and the n th  set of shift pointers h n,a , h n,b , h n,c  . . . h n,i    36  being generated from the n th  elements X n,a , X n,b , X n,c  . . . X n,i    35  from the component pseudo-random number generators X a , X b , X c  . . . X i .  
         [0122]      FIG. 5  shows an alternative embodiment of the defined-distribution expanded shuffling (DDES) pseudo-random number generator system of the claimed invention that incorporates an initialized defined-distribution table  13 , a first element from a component pseudo-random number generator Y 1    11 , a first output pointer j 1    12 , a selected first output element D j1    14 , a first set of prior elements Y 1,a , Y 1,b , Y 1,c  . . . Y 1,i    17  from the same component pseudo-random number generator Y, a first set of shift pointers h 1,a , h 1,b , h 1,c  . . . h 1,i    18 , and a first rearranged defined-distribution table  23 . Generation of subsequent rounds of output elements are represented by a second element from a component pseudo-random number generator Y 2    21 , a second output pointer j 2    22 , a selected second output element D j2    24 , a second set of prior elements Y 2,a , Y 2,b , Y 2,c  . . . Y 2,i    27  from the same component pseudo-random number generator Y, a second set of shift pointers h 2,a , h 2,b , h 2,c  . . . h 2,i    28 , and a second rearranged defined-distribution table  33 . Ultimately, the process results in an n th  set of prior elements Y n,a , Y n,b , Y n,c  . . . Y n,i    37  from the same component pseudo-random number generator Y, an n th  set of shift pointers h n,a , h n b , h n,c  . . . h n,i    38 , an n th  rearranged defined-distribution table  43 , an n+1 th  element from a component pseudo-random number generator Y n+1    41 , an n+1 th  output pointer j n+1    42 , and an n+1 th  selected output element D jn+1    44 .  
         [0123]     In the embodiment shown in  FIG. 5 , the initialized defined-distribution table  13  consists of a user-specified set of possible output values that have been initialized by the process shown in  FIG. 2 . In that process, the chosen, specified set of possible output values are loaded into an initial defined-distribution table  111  and rearranged for a specified number of cycles to create the initialized defined-distribution table ( 13  in  FIG. 2 ). The first element from the component pseudo-random number generator Y 1    11  is generated by an independent pseudo-random number generator process beneficially consisting of a set of initialization cycles of virtually any type of pseudo-random number generator process established with specified seed values. In addition, sets of prior elements from the same component pseudo-random number generator Y are retained where Y 1,a =Y 1-ta , Y 1,b =Y 1-tb , Y 1,c =Y 1-tc  . . . Y 1,i =Y 1-ti ; Y 2,a =Y 2-ta , Y 2,b =Y 2-tb , Y 2,c =Y 2-tc  . . . Y 2,i =Y 2-ti; Y   1,a =Y n-ta , Y n,b =Y n-tb , Y n,c =Y n-tc  . . . Y n,i =Y n-ti  and  1 -ta,  1 -tb,  1 -tc,  1 -ti and, in general, n-ta, n-tb, n-tc and n-ti are prior generation cycle indices that refer to prior elements from the same component pseudo-random number generator Y.  
         [0124]     The first output pointer j 1    12  may be created from the first current element from the component pseudo-random number generator Y 1    11  using a multiplicative assignment kY 1 /m y  where m y  is the modulus used in the component pseudo-random number generator Y or, more generally, where m y  is simply the range of values created by the component pseudo-random number generator Y, k is the number chosen to be smaller than the size of the initialized defined-distribution table  13  and represents the selectable portion of the initialized defined-distribution table  13  and m y  should ideally satisfy a condition specified below. Alternatively, the first output pointer j 1    12  may be created from the first current element from the component pseudo-random number generator Y 1    11  using a modular reduction assignment Y 1  mod k or from any other process that maps the values of the range of elements of the series Y generated by the component pseudo-random number generator onto the range k of the selectable portion of the initialized defined-distribution table  13 . The first output element D j1    14  of the DDES pseudo-random number generator system of the claimed invention is the element of the initialized defined-distribution table  13  selected by the first output pointer j 1    12 . The first set of shift pointers h 1,a , h 1,b , h 1,c  . . . h 1,i    18  may be created from the first set of retained prior elements Y 1,a , Y 1,b , Y 1,c  . . . Y 1,i    17  from the same component pseudo-random number generator Y using a multiplicative assignment (k+z)[Y 1,a , Y 1,b , Y 1,c  . . . Y 1,i ]/m y  where m y  is the modulus used in the component pseudo-random number generator Y or, more generally, where m y  is simply the range of values created by the component pseudo-random number generator Y, z is the number chosen such that (k+z) is the size of the entire initialized defined-distribution table  13  and m y  should ideally satisfy the condition that m y  is equal to or greater than (k+z). Alternatively, the first set of shift pointers h 1,a , h 1,b , h 1,c  . . . h 1,i    18  is created from the first set of retained prior elements Y 1,a , Y 1,b , Y 1,c  . . . Y 1,i    17  from the same component pseudo-random number generator Y using a modular reduction assignment [Y 1,a , Y 1,b , Y 1,c  . . . Y 1,i ] mod (k+z) or from any other process that maps the values of the range of elements of the series Y generated by the component pseudo-random number generator onto the range (k+z) of the entire initialized defined-distribution table  13 . In the embodiment shown in  FIG. 5 , the first rearranged defined-distribution table  23  is created from the initialized defined-distribution table  13  by switching the positions of elements in the initialized defined-distribution table  13  using the first set of shift pointers h 1,a , h 1,b , h 1,c  . . . h 1,i    18  separately from or in conjunction with the first output pointer j 1    12  created from the first current element Y 1    11  from the component pseudo-random number generator Y.  
         [0125]     For the embodiment shown in  FIG. 5 , the rearranged defined-distribution table  23  created from the first cycle of the pseudo-random number generator system of the claimed invention consists of the same specified set of possible output values that had been present in the initialized defined-distribution table  13 . The component pseudo-random number generator Y is used to generate the second element from the component pseudo-random number generator Y 2    21 . The second current element from the component pseudo-random number generator Y 2    21  is generated by the next cycle of the independent pseudo-random number generator process Y. The second output pointer j 2    22  can be conveniently created from the second current element from the component pseudo-random number generator Y 2    21  using a multiplicative assignment, modular reduction assignment or other mapping assignment process from the range of elements of the series Y generated by the component pseudo-random number generator onto the range k of the selectable portion of the rearranged defined-distribution table  23 . The second output element D j2    24  of the DDES pseudo-random number generator system of the claimed invention is the element of the rearranged defined-distribution table  23  selected by the second output pointer j 2    22 . The second set of shift pointers h 2,a , h 2,b , h 2,c  . . . h 2,i    28  can be generated from the second set of retained prior elements Y 2,a , Y 2,b , Y 2,c  . . . Y 2,i    27  from the same component pseudo-random number generator Y using a multiplicative assignment, modular reduction assignment or other mapping assignment process from the range of elements of the series Y generated by the component pseudo-random number generator onto the range (k+z) of the entire rearranged defined-distribution table  23 . The second rearranged defined-distribution table  33  is created from the first rearranged defined-distribution table  23  by switching the positions of elements in the first rearranged defined-distribution table  23  using the second set of shift pointers h 2,a , h 2,b , h 2,c  . . . h 2,i    28  separately from or in conjunction with the second output pointer j 2    22  created from the second current element Y 2    21  from the component pseudo-random number generator Y.  
         [0126]     Subsequent cycles of operation of the embodiment of the pseudo-random number generator system of the claimed invention as shown in  FIG. 5  are represented by the n+1 th  cycle where the n th  rearranged defined-distribution table  43  is created from the prior rearranged defined-distribution table using the n th  set of retained prior elements Y n,a , Y n,b , Y n,c  . . . Y n,i    37  from the same component pseudo-random number generator Y to create the resulting n th  set of shift pointers h n,a , h n,b , h n,c  . . . h n,i    38  separately from or in conjunction with the n th  output pointer j n  (not shown) created from the n th  current element from the component pseudo-random number generator Y n  (not shown), by rearranging the positions of elements in the n−1 th  rearranged defined-distribution table. The n+1 th  element from the component pseudo-random number generator Y n+1    41  is generated by the next cycle of the independent pseudo-random number generator process Y from which the n+1 th  output pointer j n+1    42  is created. The n+1 th  output element D jn+1    44  of the DDES pseudo-random number generator system of the claimed invention is the element of the n th  rearranged defined-distribution table  43  selected by the n+1 th  output pointer J n+1    42 . In this manner, a series of pseudo-random numbers D j1    14 , D j2    24 , . . . D jn+1    44  is generated.  
         [0127]     In  FIG. 6 , an example demonstrates the sequential operation of the functional components of the alternative embodiment of the defined-distribution expanded shuffling (DDES) pseudo-random number generator system of the claimed invention for the embodiment that is shown in  FIG. 4 . The example of  FIG. 6  incorporates single output pointers [ 43 ,  15 , k−1,  17 ]  12 ,  22 ,  32 ,  42  created from specified initial elements [ 255 ,  121 ,  423 ,  335 ]  11 ,  21 ,  31 ,  41  generated by a component pseudo-random number generator Y, multiple shift pointers [ 16 ,  1 ,  52 ,  43 ,  44 ;  2 ,  63 ,  42 ,  44 ,  17 ;  0 ,  2 ,  16 ,  43 ,  17 ]  16 ,  26 ,  36  created from from specified initial elements [ 144 ,  321 ,  372 ,  235 ,  364 ;  258 ,  447 ,  362 ,  172 ,  465 ;  64 ,  386 ,  208 ,  107 ,  17 ]  15 ,  25 ,  35  generated by a component pseudo-random number generator X, and an initialized defined-distribution table  13  containing (k+z) elements over the uniform range of 8 values from 0 to 7 with k being set to 53; (k+z) being set to  64 ; the 0 th , 1 st  and 2 nd  elements being 7, 2 and 5; the 15 th , 16 th  and 17 th  elements being 5, 3 and 6; the 42 nd , 43 nd  and 44 th  elements being 7, 1 and 0; the k−1 th , k th  and k+1 th  elements being 4, 5 and 7; and the (k+z−1) th  element being  2 . Note that the initialized defined-distribution table  13  contains p=8 values in a full representation of the desired uniform distribution and that z is chosen to be 11 satisfying the condition that (k+z) mod p≡0. Further note that the range of elements of the component pseudo-random number generator Y, m y =424, satisfies the condition that m y  is equal to or greater than k since 424≦53 and that the range of elements of the component pseudo-random number generator X, m x =465, satisfies the condition that m x  is equal to or greater than (k+z) since 465≦64. Output pointers j  12 ,  22 ,  32 ,  42  were created using a modular reduction assignment Y mod k where k=53 and shift pointers h  16 ,  26 ,  36  were created using a modular reduction assignment [X a , X b , X c  . . . X i ] mod (k+z) where (k+z)=64. The example shown in  FIG. 6  incorporates an initialized defined-distribution table  13 , a first element from a component pseudo-random number generator Y with a value of [255]  11 , a first output pointer with a value of [43]  12 , a selected first output element with a value of [1]  14 , a first set of elements from a component pseudo-random number generator X with values of [144, 321, 372, 235, 364]  15 , a first set of shift pointers with values of [16, 1, 52, 43, 44]  16 , and a first rearranged defined-distribution table  23 . Generation of subsequent rounds of output elements are represented by a second element from a component pseudo-random number generator Y with a value of [121]  21 , a second output pointer with a value of [15]  22 , a selected second output element with a value of [5]  24 , a second set of elements from a component pseudo-random number generator X with values of [258, 447, 362, 172, 465]  25 , a second set of shift pointers with values of [2, 63, 42, 44, 17]  26 , and a second rearranged defined-distribution table  33 ; a third element from a component pseudo-random number generator Y with a value of [423]  31 , a third output pointer with a value of [k−1 (i.e., 52)]  32 , a selected third output element with a value of [1]  34  , a third set of elements from a component pseudo-random number generator X with values of [64, 386, 208, 107, 17]  35 , a third set of shift pointers with values of [0, 2, 16, 43, 17]  36 , and a third rearranged defined-distribution table  43 ; and a fourth element from a component pseudo-random number generator Y with a value of [335]  41 , a fourth output pointer with a value of [17]  42 , a selected fourth output element with a value of [7]  44 , etc.  
         [0128]     In the example of the embodiment shown in  FIG. 6 , the initialized defined-distribution table  13  consists of a user-specified set of 8 possible output values over the range of 0 to 7 uniformly distributed with 8 copies of each output value loaded into an initial defined-distribution table of 64 elements and rearranged for a specified number of cycles resulting in the sample values shown. The component pseudo-random number generator Y consists of an independent pseudo-random number generator process yielding the first element value of [255]  11 . The first output pointer value of [43]  12  is created from the first element from the component pseudo-random number generator [ 255 ]  11  using a modular reduction assignment [ 255 ] mod 53. The first output element value of [1]  14  is found as the value of the initialized defined-distribution table  13  associated with the location pointer of [ 43 ]  12 . The component pseudo-random number generator X consists of an independent pseudo-random number generator process yielding the first set of element values of [144, 321, 372, 235, 364]  15 . The first set of shift pointer values of [16, 1, 52, 43, 44]  16  is created from the first set of elements from the component pseudo-random number generator X [ 144 ,  321 ,  372 ,  235 ,  364 ]  15  using a modular reduction assignment [ 144 ,  321 ,  372 ,  235 ,  364 ] mod 64. The first rearranged defined-distribution table  23  is created from the initialized defined-distribution table  13  by switching the positions of elements in the initialized defined-distribution table  13  using the first set of shift pointers [ 16 ,  1 ,  52 ,  43 ,  44 ]  16 , that is, D[temp]←D[ 16 ], D[ 16 ]←D[ 1 ], D[ 1 ]←D[ 52 ], D[ 52 ]←D[ 43 ], D[ 43 ]←D[ 44 ], D[ 44 ]←D[temp] which results in the shifting of values as D[temp]←[ 3 ], D[ 16 ]←[ 2 ], D[ 1 ]←[ 4 ], D[ 52 ]←[ 1 ], D[ 43 ]←[ 0 ], D[ 44 ]←+[ 3 ], where D represents the defined-distribution table  13  and D[h] represents the value of the defined-distribution table for location pointer h  16 .  
         [0129]     For the example of the embodiment shown in  FIG. 6 , the rearranged defined-distribution table  23  created from the first cycle of the pseudo-random number generator system of the claimed invention consists of the same specified set of possible output values that had been loaded into an initial defined-distribution table  111  of  FIG. 2  and following the procedure described for  FIG. 2  resulted in an initialized defined-distribution table  13  in  FIG. 2 . For the second cycle of the example of pseudo-random number generator system, the component pseudo-random number generator Y yields the second element value of [121]  21 . The second output pointer value of [15]  22  is created using a modular reduction assignment [ 121 ] mod  53 . The second output element value of [5]  24  is found as the value of the rearranged defined-distribution table  23  associated with the location pointer of [ 15 ]  22 . The component pseudo-random number generator X yields the second set of element values of [258, 447, 362, 172, 465]  25 . The second set of shift pointer values of [2, 63, 42, 44, 17]  26  is created using a modular reduction assignment [ 258 ,  447 ,  362 ,  172 ,  465 ] mod  64 . The second rearranged defined-distribution table  33  is created from the rearranged defined-distribution table  23  by switching the positions of elements D[temp]←D[ 2 ], D[ 2 ]←D[ 63 ], D[ 63 ]←D[ 42 ], D[ 42 ]←D[ 44 ], D[ 44 ]←D[ 17 ], D[ 17 ]←D[temp] which results in the shifting of values as D[temp]←[ 5 ], D[ 2 ]←[ 2 ], D[ 63 ]←[ 7 ], D[ 42 ]←[ 3 ], D[ 44 ]←[ 6 ], D[ 17 ]←[ 5 ].  
         [0130]     For the third cycle of the example of the pseudo-random number generator system shown in  FIG. 6 , Y yields the third element value of [423]  31 ; the third output pointer value is [k−1 (i.e., 52)]  32  (from  423  mod  53 ); the third output element value of [1]  34  is found from the rearranged defined-distribution table  33  using the location pointer of [k−1]; X yields the third set of element values of [64, 386, 208, 107, 17]  35 ; the third set of shift pointer values is [0, 2, 16, 43, 17]  36  (from [64, 386, 208, 107, 17] mod  64 ); the third rearranged defined-distribution table  43  is created from the rearranged defined-distribution table  33  by switching the positions of elements D[temp]←D[ 0 ], D[ 0 ]←D[ 2 ], D[ 2 ]←D[ 16 ], D[ 16 ]←D[ 43 ], D[ 43 ]←, D[ 17 ], D[ 17 ]←D[temp] or D[temp]←[ 7 ], D[ 0 ]←[ 2 ], D[ 2 ]←[ 2 ], D[ 16 ]←[ 0 ], D[ 43 ]←[ 5 ], D[ 17 ]←[ 7 ].  
         [0131]     The beginning of the fourth cycle of the example shown in  FIG. 6  shows Y with a fourth element value of [335]  41 ; the fourth output pointer value of [17]  42  (from 335 mod  53 ); and the fourth output element value of [7]  44  found from the rearranged defined-distribution table  43  using the location pointer of [ 17 ]  42 .  
         [0132]     Subsequent cycles of operation of the example embodiment of the pseudo-random number generator system of the claimed invention as shown in  FIG. 6  would use subsequent X values to create shift pointers and rearrange the defined-distribution table. Following Y values would create output pointers that would select output element values from the rearranged defined-distribution table. Ultimately, the example in  FIG. 6  yields a series of pseudo random numbers [ 1 ,  5 ,  1 ,  7  . . . ]  14 ,  24 ,  34 ,  44 .  
         [0133]     Although the present invention has been described in terms of the presently preferred embodiment, it is to be understood that such disclosure is purely illustrative and is not to be interpreted as limiting. Consequently, without departing from the spirit and scope of the invention, various alterations, modifications, and/or alternative applications of the invention will, no doubt, be suggested to those skilled in the art after having read the preceding disclosure. Accordingly, it is intended that the following claims be interpreted as encompassing all alterations, modifications, or alternative applications as fall within the true spirit and scope of the invention.