سؤال

لقد كنت أعمل على برنامج نصي لبيرلين ولكني أواجه مشكلات في إنشاء قيم عشوائية زائفة بسيطة.

أحتاج إلى أن أكون قادرًا على إنشاء قيمة أولية من إحداثي xy ولكن x+y به مشاكل واضحة مع القيم المتكررة.كما أنهم يذهبون إلى الفضاء السلبي لذلك لا يعمل x^y.

آسف إذا تمت الإجابة على هذا السؤال بالفعل في مكان آخر ولكن إما أنني لم أفهمه أو لم أتمكن من العثور عليه.

هل كانت مفيدة؟

المحلول

تحتاج إلى تحديد المشكلة بشكل أفضل للحصول على إجابة مثالية.

إذا كانت قيم X و Y صغيرة نسبيا، فيمكنك وضعها في الأجزاء العالية والمنخفضة من عدد صحيح (هي البذور في لغتك عدد صحيح)، على سبيل المثاللمنصة 32 بت:

int seed= x << 16 + y؛

إذا كانت قيمة البذور لا يسمح لها أن تكون سلبية (لم أفهم تماما ما تقصده "المساحة السلبية" في سؤالك، سواء كنت تشير إلى الجغرافيا أو قيمة البذور)، يمكنك أن تأخذ القيمة المطلقةمن البذور.

إذا كنت تقصد أن الإحداثيات يمكن أن يكون لها قيم سلبية، فإن أفضل مسار عملك يعتمد على ما إذا كنت تريد نفس البذور من أجل الإحداثيات وعكسها.

نصائح أخرى

هل تريد أن تؤدي إلى رقم عشوائي متكرر لكل X، Y زوج؟

باستخدام مزيج خطي أو في الوظيفة العامة من X، S AS SEED سيعطي القطع الأثرية في التوزيع (على الأقل إذا لم تستخدم وظيفة معقدة للغاية). حاول مع هذا، لدي نفس المشكلة التي عملت من أجلي

giveacodicetagpre.

من أجل استخدامه:

giveacodicetagpre.

بهذه الطريقة يمكنك الحصول على تسلسل عشوائي جيد غير محدد.

يمكنني استخدامها في JS ولكن يجب أن تعمل أيضا في لغات أخرى يفترض أن حجة البذور والقيمة التي تم إرجاعها من RND هو عدد صحيح.

خذ القيمة المطلقة لكليهما x و y أولاً؛ثم x^y سوف تعمل بشكل جيد.إحدى أسهل الطرق لإنشاء مصدر عشوائي زائف هي مع مرور الوقت.قد تحاول الضرب x^y حسب وقت النظام الحالي؛تتمتع هذه الطريقة بفرصة منخفضة للغاية لتوليد قيم بذور متكررة.

إذا كنت تعرف مجموعة من القيم لديك، فيمكنك ببساطة إلقاء X و Y كسلاسل مبطنة بأصفار الأصفار، إلحاق الخطتين، ثم قم بتشغيل السلسلة الناتجة من خلال وظيفة التجزئة.

في C#، تم تكييفها وتحسينها من إجابة alexroat.فقط اضبط Random.seed = MyUtils.GetSeedXY(x, y) وأنت على ما يرام.

public static class MyUtils
{
    static int seed2(int _s)
    {
        var s = 192837463 ^ System.Math.Abs(_s);
        var a = 1664525;
        var c = 1013904223;
        var m = 4294967296;
        return (int) ((s * a + c) % m);
    }

    public static int GetSeedXY(int x, int y)
    {
        int sx = seed2(x * 1947);
        int sy = seed2(y * 2904);
        return seed2(sx ^ sy);
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top