Приложение, над которым я работаю, требует матрицы случайных чисел. Матрица может расти в любом направлении в любое время и не всегда заполнена. (Я, вероятно, в конечном итоге повторно реализую его с помощью четырехугольного дерева или чего-то еще, а не матрицы с большим количеством нулевых объектов.)
Мне нужен способ генерировать одну и ту же матрицу с учетом того же начального числа, независимо от того, в каком порядке я вычисляю матрицу.
LazyRandomMatrix rndMtx1 = new LazyRandomMatrix(1234) // Seed new object
float X = rndMtx1[0,0] // Lazily generate random numbers on demand
float Y = rndMtx1[3,16]
float Z = rndMtx1[23,-5]
Debug.Assert(X == rndMtx1[0,0])
Debug.Assert(Y == rndMtx1[3,16])
Debug.Assert(Z == rndMtx1[23,-5])
LazyRandomMatrix rndMtx2 = new LazyRandomMatrix(1234) // Seed second object
Debug.Assert(Y == rndMtx2[3,16]) // Lazily generate the same random numbers
Debug.Assert(Z == rndMtx2[23,-5]) // on demand in a different order
Debug.Assert(X == rndMtx2[0,0])
Да, если бы я знал размеры массива, лучшим способом было бы сгенерировать весь массив и просто возвращать значения, но их нужно генерировать независимо и по требованию.
Моя первая идея состояла в том, чтобы инициализировать новый генератор случайных чисел для каждого вызова новой координаты, добавив в него некоторый хэш начального числа всей матрицы и координат, используемых при вызове, но это кажется ужасным взломом, поскольку требуется создать тонну новых Random
объектов.