<p>The problem is that the <a href="https://developer.apple.com/documentation/gameplaykit/gkrandom/1501054-nextint" rel="nofollow noreferrer"><code>nextInt()</code></a> method of all <code>GKRandom</code> types returns an integer value in the range <code>[INT32_MIN, INT32_MAX]</code>, which means that your “non-working” implementation of <code>next()</code> returns 64-bit values with the high 32 bits equal to zero. This “violates” the requirement of the <a href="https://developer.apple.com/documentation/swift/randomnumbergenerator" rel="nofollow noreferrer"><code>RandomNumberGenerator</code></a> protocol that calls to <code>next()</code> must produce uniformly distributed 64-bit values.</p>

<p>In older Swift releases this might not have caused problems, but with the <a href="https://github.com/apple/swift/commit/2bc648c26baccd95847cde2ad025c8c1b1fd0375" rel="nofollow noreferrer">implementation</a> of <a href="https://arxiv.org/pdf/1805.10941.pdf" rel="nofollow noreferrer">Lemire’s Nearly Divisionless Random Integer Generation</a> on 64-bit Intel platforms this has the effect that <code>Random.next(upperBound:)</code> always returns zero:</p>

<pre><code>var gen = SeededGenerator(seed: 234)
print((0..&lt;20).map { _ in Int.random(in: 0..&lt;10, using: &amp;gen) })
// [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
</code></pre>

<p>As a consequence, the <code>shuffle()</code> method does not swap array elements at all.</p>

<p>Your alternative implementation of <code>next()</code> works because it fills both the low and the high 32 bits of the 64-bit random number.</p>
Array shuffle(using: RandomNumberGenerator) strange behavior
<p>Since Xcode 11.4 the array doesn't get shuffled at all (regardless of the seed) when using the second implementation of the <code>next</code> function.</p>

<p>I don't get why, since both functions generate random numbers, even though the first only populates the least significant 32 bits of the random Int64.</p>

<p>You can try this minimal example in Swift Playgrounds, commenting out one of the two functions.</p>

<pre><code>    import GameplayKit

    struct SeededGenerator: RandomNumberGenerator {
        static var shared: SeededGenerator?

        let seed: UInt64
        let generator: GKMersenneTwisterRandomSource

        init(seed: UInt64) {
            self.seed = seed
            generator = GKMersenneTwisterRandomSource(seed: seed)
        }

        // New alternative found to be working
        mutating func next() -&gt; UInt64 {
            let next1 = UInt64(bitPattern: Int64(generator.nextInt()))
            let next2 = UInt64(bitPattern: Int64(generator.nextInt()))
            return next1 | (next2 &lt;&lt; 32)
        }

        // Code previously in use that doesn't work anymore.
        mutating func next() -&gt; UInt64 {
            return UInt64(bitPattern: Int64(abs(generator.nextInt())))
        }
    }

    var gen = SeededGenerator(seed: 234)

    var array = ["1", "2", "3"]
    array.shuffle(using: &amp;gen)
</code></pre>