TI-84 Plus Random Number Generator Algorithm

前端 未结 3 1149
无人及你
无人及你 2020-12-30 04:32

Edit: my main question is that I want to replicate the TI-84 plus RNG algorithm on my computer, so I can write it in a language like Javascript or Lua, to t

3条回答
  •  离开以前
    2020-12-30 05:20

    I implemented rand, randInt, randM and randBin in Python. Thanks Richard for the C code. All implemented commands work as expected. You can also find it in this Gist.

    import math
    
    
    class TIprng(object):
        def __init__(self):       
            self.mod1 = 2147483563
            self.mod2 = 2147483399
            self.mult1 = 40014
            self.mult2 = 40692
            self.seed1 = 12345
            self.seed2 = 67890
    
        def seed(self, n):
            n = math.fabs(math.floor(n))
            if (n == 0):
                self.seed1 = 12345
                self.seed2 = 67890
            else:
                self.seed1 = (self.mult1 * n) % self.mod1
                self.seed2 = (n)% self.mod2
    
        def rand(self, times = 0):
            # like TI, this will return a list (array in python) if times == 1,
            # or an integer if times isn't specified
            if not(times):
                self.seed1  = (self.seed1 * self.mult1) % self.mod1
                self.seed2  = (self.seed2 * self.mult2)% self.mod2
                result = (self.seed1 - self.seed2)/self.mod1
                if(result<0):
                    result = result+1
                return result
            else:
                return [self.rand() for _ in range(times)]
    
        def randInt(self, minimum, maximum, times = 0):
            # like TI, this will return a list (array in python) if times == 1,
            # or an integer if times isn't specified
            if not(times):
                if (minimum < maximum):
                    return (minimum + math.floor((maximum- minimum + 1) * self.rand()))
                else:
                        return (maximum + math.floor((minimum - maximum + 1) * self.rand()))
            else:
                return [self.randInt(minimum, maximum) for _ in range(times)]
    
        def randBin(self, numtrials, prob, times = 0):
            if not(times):
                return sum([(self.rand() < prob) for _ in range(numtrials)])
            else:
                return [self.randBin(numtrials, prob) for _ in range(times)]
    
        def randM(self, rows, columns):
            # this will return an array of arrays
            matrixArr = [[0 for x in range(columns)] for x in range(rows)]
            # we go from bottom to top, from right to left
            for row in reversed(range(rows)):
                for column in reversed(range(columns)):
                    matrixArr[row][column] = self.randInt(-9, 9)
            return matrixArr
    
    testPRNG = TIprng()    
    testPRNG.seed(0)
    print(testPRNG.randInt(0,100))
    testPRNG.seed(0)
    print(testPRNG.randM(3,4))
    

提交回复
热议问题