BlessRNG ืื• ื‘ื“ื™ืงืช ื”-RNG ืœื”ื’ื™ื ื•ืช

BlessRNG ืื• ื‘ื“ื™ืงืช ื”-RNG ืœื”ื’ื™ื ื•ืช

ื‘ืคื™ืชื•ื— ืžืฉื—ืงื™ื, ืœืขืชื™ื ืงืจื•ื‘ื•ืช ืฆืจื™ืš ืœืงืฉื•ืจ ืžืฉื”ื• ืœืืงืจืื™ื•ืช: ืœ-Unity ื™ืฉ ืจื ื“ื•ื ืžืฉืœื” ื‘ืฉื‘ื™ืœ ื–ื”, ื•ื‘ืžืงื‘ื™ืœ ืœื–ื” ื™ืฉ System.Random. ืคืขื, ื‘ืื—ื“ ื”ืคืจื•ื™ืงื˜ื™ื, ื”ืชืจืฉืžืชื™ ืฉืฉื ื™ื”ื ื™ื›ื•ืœื™ื ืœืขื‘ื•ื“ ืื—ืจืช (ืื ื›ื™ ืฆืจื™ื›ื” ืœื”ื™ื•ืช ืœื”ื ื—ืœื•ืงื” ืฉื•ื•ื”).

ืื—ืจ ื›ืš ื”ื ืœื ื ื›ื ืกื• ืœืคืจื˜ื™ื - ืžืกืคื™ืง ืฉื”ืžืขื‘ืจ ืœ-System.Random ืชื™ืงืŸ ืืช ื›ืœ ื”ื‘ืขื™ื•ืช. ื›ืขืช ื”ื—ืœื˜ื ื• ืœื‘ื“ื•ืง ืืช ื–ื” ื‘ื™ืชืจ ืคื™ืจื•ื˜ ื•ืœืขืจื•ืš ืžื—ืงืจ ืงื˜ืŸ: ืขื“ ื›ืžื” RNGs ื”ื "ืžืฉื•ื—ื“ื™ื" ืื• ืฆืคื•ื™ื™ื, ื•ื‘ืื™ื–ื” ืžื”ื ืœื‘ื—ื•ืจ. ื™ืชืจ ืขืœ ื›ืŸ, ืœื ืคืขื ืฉืžืขืชื™ ื“ืขื•ืช ืกื•ืชืจื•ืช ืœื’ื‘ื™ ื”"ื›ื ื•ืช" ืฉืœื”ื - ื‘ื•ืื• ื ื ืกื” ืœื”ื‘ื™ืŸ ืื™ืš ื”ืชื•ืฆืื•ืช ื”ืืžื™ืชื™ื•ืช ืžืฉืชื•ื•ืช ืœืืœื” ื”ืžื•ืฆื”ืจื•ืช.

ืชื•ื›ื ื™ืช ื—ื™ื ื•ื›ื™ืช ืงืฆืจื” ืื• RNG ื”ื™ื ืœืžืขืฉื” RNG

ืื ืืชื” ื›ื‘ืจ ืžื›ื™ืจ ืžื—ื•ืœืœื™ ืžืกืคืจื™ื ืืงืจืื™ื™ื, ืืชื” ื™ื›ื•ืœ ืžื™ื“ ืœื“ืœื’ ืœืกืขื™ืฃ "ื‘ื“ื™ืงื•ืช".

ืžืกืคืจื™ื ืืงืจืื™ื™ื (RN) ื”ื ืจืฆืฃ ืฉืœ ืžืกืคืจื™ื ืฉื ื•ืฆืจ ื‘ืืžืฆืขื•ืช ืชื”ืœื™ืš ืืงืจืื™ (ื›ืื•ื˜ื™) ื›ืœืฉื”ื•, โ€‹โ€‹ืžืงื•ืจ ืœืื ื˜ืจื•ืคื™ื”. ื›ืœื•ืžืจ, ืžื“ื•ื‘ืจ ื‘ืจืฆืฃ ืฉื”ืืœืžื ื˜ื™ื ืฉืœื• ืื™ื ื ืงืฉื•ืจื™ื ื–ื” ื‘ื–ื” ื‘ืฉื•ื ื—ื•ืง ืžืชืžื˜ื™ - ืื™ืŸ ืœื”ื ืงืฉืจ ืฉืœ ืกื™ื‘ื” ื•ืชื•ืฆืื”.

ืžื” ืฉื™ื•ืฆืจ ืืช ื”ืžืกืคืจ ื”ืืงืจืื™ ื ืงืจื ืžื—ื•ืœืœ ืžืกืคืจื™ื ืืงืจืื™ื™ื (RNG). ื ืจืื” ืฉื”ื›ืœ ืืœืžื ื˜ืจื™, ืื‘ืœ ืื ื ืขื‘ื•ืจ ืžืชืื•ืจื™ื” ืœืคืจืงื˜ื™ืงื”, ืื– ืœืžืขืฉื” ื–ื” ืœื ื›ืœ ื›ืš ืคืฉื•ื˜ ืœื™ื™ืฉื ืืœื’ื•ืจื™ืชื ืชื•ื›ื ื” ืœื™ืฆื™ืจืช ืจืฆืฃ ื›ื–ื”.

ื”ืกื™ื‘ื” ื ืขื•ืฆื” ื‘ื”ื™ืขื“ืจ ืื•ืชื• ื›ืื•ืก ื‘ืžื•ืฆืจื™ ืืœืงื˜ืจื•ื ื™ืงื” ืžื•ื“ืจื ื™ืช. ื‘ืœืขื“ื™ื•, ืžืกืคืจื™ื ืืงืจืื™ื™ื ืžืคืกื™ืงื™ื ืœื”ื™ื•ืช ืืงืจืื™ื™ื, ื•ื”ืžื—ื•ืœืœ ืฉืœื”ื ื”ื•ืคืš ืœืคื•ื ืงืฆื™ื” ืจื’ื™ืœื” ืฉืœ ืืจื’ื•ืžื ื˜ื™ื ืžื•ื’ื“ืจื™ื ื‘ืขืœื™ืœ. ืขื‘ื•ืจ ืžืกืคืจ ื”ืชืžื—ื•ื™ื•ืช ื‘ืชื—ื•ื ื”-IT ืžื“ื•ื‘ืจ ื‘ื‘ืขื™ื” ืจืฆื™ื ื™ืช (ืœืžืฉืœ ืงืจื™ืคื˜ื•ื’ืจืคื™ื”), ืืš ืขื‘ื•ืจ ืื—ืจื™ื ื™ืฉ ืคืชืจื•ืŸ ืžืงื•ื‘ืœ ืœื—ืœื•ื˜ื™ืŸ.

ื™ืฉ ืฆื•ืจืš ืœื›ืชื•ื‘ ืืœื’ื•ืจื™ืชื ืฉื™ื—ื–ื™ืจ, ืืžื ื ืœื ืžืกืคืจื™ื ืืงืจืื™ื™ื ื‘ืืžืช, ืื‘ืœ ื›ืžื” ืฉื™ื•ืชืจ ืงืจื•ื‘ ืืœื™ื”ื - ืžื” ืฉื ืงืจื ืžืกืคืจื™ื ืคืกืื•ื“ื•-ืืงืจืื™ื™ื (PRN). ื”ืืœื’ื•ืจื™ืชื ื‘ืžืงืจื” ื–ื” ื ืงืจื ืžื—ื•ืœืœ ืžืกืคืจื™ื ืคืกืื•ื“ื• ืืงืจืื™ื™ื (PRNG).

ื™ืฉื ืŸ ืžืกืคืจ ืืคืฉืจื•ื™ื•ืช ืœื™ืฆื™ืจืช PRNG, ืืš ื”ื“ื‘ืจื™ื ื”ื‘ืื™ื ื™ื”ื™ื• ืจืœื•ื•ื ื˜ื™ื™ื ืขื‘ื•ืจ ื›ื•ืœื:

  1. ื”ืฆื•ืจืš ื‘ืืชื—ื•ืœ ืžืงื“ื™ื.

    ืœ-PRNG ืื™ืŸ ืžืงื•ืจ ืื ื˜ืจื•ืคื™ื”, ื•ืœื›ืŸ ื™ืฉ ืœืชืช ืœื• ืžืฆื‘ ืจืืฉื•ื ื™ ืœืคื ื™ ื”ืฉื™ืžื•ืฉ. ื”ื•ื ืžืฆื•ื™ืŸ ื›ืžืกืคืจ (ืื• ื•ืงื˜ื•ืจ) ื•ื ืงืจื ื–ืจืข (ื–ืจืข ืืงืจืื™). ืœืขืชื™ื ืงืจื•ื‘ื•ืช, ืžื•ื ื” ื”ืฉืขื•ืŸ ืฉืœ ื”ืžืขื‘ื“ ืื• ื”ืžืงื‘ื™ืœื” ื”ืžืกืคืจื™ืช ืฉืœ ื–ืžืŸ ื”ืžืขืจื›ืช ืžืฉืžืฉ ื›ืžืงื•ืจ.

  2. ื™ื›ื•ืœืช ืฉื—ื–ื•ืจ ืฉืœ ืจืฆืฃ.

    ื”-PRNG ื”ื•ื ื“ื˜ืจืžื™ื ื™ืกื˜ื™ ืœื—ืœื•ื˜ื™ืŸ, ื›ืš ืฉื”-Seed ืฉืฆื•ื™ืŸ ื‘ืžื”ืœืš ื”ืืชื—ื•ืœ ืงื•ื‘ืข ื‘ืื•ืคืŸ ื™ื™ื—ื•ื“ื™ ืืช ื›ืœ ืจืฆืฃ ื”ืžืกืคืจื™ื ื”ืขืชื™ื“ื™. ืžืฉืžืขื•ืช ื”ื“ื‘ืจ ื”ื™ื ืฉ-PRNG ื ืคืจื“ ืฉืื•ืชื—ืœ ืขื ืื•ืชื• ืกื™ื“ (ื‘ื–ืžื ื™ื ืฉื•ื ื™ื, ื‘ืชื•ื›ื ื™ื•ืช ืฉื•ื ื•ืช, ื‘ืžื›ืฉื™ืจื™ื ืฉื•ื ื™ื) ื™ืคื™ืง ืืช ืื•ืชื• ืจืฆืฃ.

ืฆืจื™ืš ืœื“ืขืช ื’ื ืืช ื”ืชืคืœื’ื•ืช ื”ื”ืกืชื‘ืจื•ืช ื”ืžืืคื™ื™ื ืช ืืช ื”-PRNG - ืื™ืœื• ืžืกืคืจื™ื ื”ื•ื ื™ืคื™ืง ื•ื‘ืื™ื–ื” ื”ืกืชื‘ืจื•ืช. ืœืจื•ื‘ ื–ื• ื”ืชืคืœื’ื•ืช ื ื•ืจืžืœื™ืช ืื• ื”ืชืคืœื’ื•ืช ืื—ื™ื“ื”.
BlessRNG ืื• ื‘ื“ื™ืงืช ื”-RNG ืœื”ื’ื™ื ื•ืช
ื”ืชืคืœื’ื•ืช ื ื•ืจืžืœื™ืช (ืฉืžืืœ) ื•ื”ืชืคืœื’ื•ืช ืื—ื™ื“ื” (ื™ืžื™ืŸ)

ื ื ื™ื— ืฉื™ืฉ ืœื ื• ืงื•ื‘ื™ื™ื” ื”ื•ื’ื ืช ืขื 24 ืฆื“ื“ื™ื. ืื ืชื–ืจื•ืง ืื•ืชื•, ื”ื”ืกืชื‘ืจื•ืช ืœืงื‘ืœ ืื—ื“ ืชื”ื™ื” ืฉื•ื•ื” ืœ-1/24 (ื–ื”ื” ืœื”ืกืชื‘ืจื•ืช ืœืงื‘ืœ ื›ืœ ืžืกืคืจ ืื—ืจ). ืื ืชื‘ืฆืข ื–ืจื™ืงื•ืช ืจื‘ื•ืช ื•ืชืจืฉื ืืช ื”ืชื•ืฆืื•ืช, ืชื‘ื—ื™ืŸ ืฉื›ืœ ื”ืงืฆื•ื•ืช ื ื•ืฉืจื™ื ื‘ืขืจืš ื‘ืื•ืชื” ืชื“ื™ืจื•ืช. ื‘ืขื™ืงืจื• ืฉืœ ื“ื‘ืจ, ืงื•ื‘ื™ื™ื” ื–ื• ื™ื›ื•ืœื” ืœื”ื™ื—ืฉื‘ ื›-RNG ืขื ื—ืœื•ืงื” ืื—ื™ื“ื”.

ืžื” ืื ืชื–ืจื•ืง 10 ืžื”ืงื•ื‘ื™ื•ืช ื”ืืœื” ื‘ื‘ืช ืื—ืช ื•ืชืกืคื•ืจ ืืช ืกืš ื”ื ืงื•ื“ื•ืช? ื”ืื ืชื™ืฉืžืจ ืขื‘ื•ืจื• ืื—ื™ื“ื•ืช? ืœื. ืœืจื•ื‘, ื”ืกื›ื•ื ื™ื”ื™ื” ืงืจื•ื‘ ืœ-125 ื ืงื•ื“ื•ืช, ื›ืœื•ืžืจ ืœืขืจืš ืžืžื•ืฆืข ื›ืœืฉื”ื•. ื•ื›ืชื•ืฆืื” ืžื›ืš, ืขื•ื“ ืœืคื ื™ ื‘ื™ืฆื•ืข ื–ืจื™ืงื”, ืืชื” ื™ื›ื•ืœ ืœื”ืขืจื™ืš ื‘ืื•ืคืŸ ื’ืก ืืช ื”ืชื•ืฆืื” ื”ืขืชื™ื“ื™ืช.

ื”ืกื™ื‘ื” ื”ื™ื ืฉื™ืฉ ืืช ื”ืžืกืคืจ ื”ื’ื“ื•ืœ ื‘ื™ื•ืชืจ ืฉืœ ืฉื™ืœื•ื‘ื™ื ื›ื“ื™ ืœื”ืฉื™ื’ ืืช ื”ืฆื™ื•ืŸ ื”ืžืžื•ืฆืข. ื›ื›ืœ ืฉืžืชืจื—ืงื™ื ืžืžื ื•, ืคื—ื•ืช ืฆื™ืจื•ืคื™ื - ื•ื‘ื”ืชืื, ื”ื”ืกืชื‘ืจื•ืช ืœื”ืคืกื“ ื ืžื•ื›ื” ื™ื•ืชืจ. ืื ื”ื ืชื•ื ื™ื ื”ืืœื” ืžื•ืฆื’ื™ื, ื”ื ื™ื“ื•ืžื™ื ื‘ืžืขื•ืจืคืœ ืœืฆื•ืจืช ืคืขืžื•ืŸ. ืœื›ืŸ, ืขื ืงืฆืช ืžืชื™ื—ื”, ืžืขืจื›ืช ืฉืœ 10 ืงื•ื‘ื™ื•ืช ื™ื›ื•ืœื” ืœื”ื™ืงืจื RNG ืขื ื”ืชืคืœื’ื•ืช ื ื•ืจืžืœื™ืช.

ื“ื•ื’ืžื” ื ื•ืกืคืช, ืจืง ื”ืคืขื ื‘ืžื˜ื•ืก - ื™ืจื™ ืœืขื‘ืจ ืžื˜ืจื”. ื”ื™ื•ืจื” ื™ื”ื™ื” RNG ืฉื™ื•ืฆืจ ื–ื•ื’ ืžืกืคืจื™ื (x, y) ื”ืžื•ืฆื’ ืขืœ ื”ื’ืจืฃ.
BlessRNG ืื• ื‘ื“ื™ืงืช ื”-RNG ืœื”ื’ื™ื ื•ืช
ืžืกื›ื™ื ืฉื”ืื•ืคืฆื™ื” ืžืฉืžืืœ ืงืจื•ื‘ื” ื™ื•ืชืจ ืœื—ื™ื™ื ื”ืืžื™ืชื™ื™ื - ื–ื”ื• RNG ืขื ื”ืชืคืœื’ื•ืช ื ื•ืจืžืœื™ืช. ืื‘ืœ ืื ืืชื” ืฆืจื™ืš ืœืคื–ืจ ื›ื•ื›ื‘ื™ื ื‘ืฉืžื™ื ื—ืฉื•ื›ื™ื, ืื– ื”ืืคืฉืจื•ืช ื”ื ื›ื•ื ื”, ื”ืžืชืงื‘ืœืช ื‘ืืžืฆืขื•ืช RNG ืขื ื”ืคืฆื” ืื—ื™ื“ื”, ืžืชืื™ืžื” ื™ื•ืชืจ. ื‘ืื•ืคืŸ ื›ืœืœื™, ื‘ื—ืจ ื’ื ืจื˜ื•ืจ ื‘ื”ืชืื ืœืžืฉื™ืžื” ื”ืขื•ืžื“ืช ืขืœ ื”ืคืจืง.

ืขื›ืฉื™ื• ื‘ื•ืื• ื ื“ื‘ืจ ืขืœ ื”ืื ื˜ืจื•ืคื™ื” ืฉืœ ืจืฆืฃ ื”-PNG. ืœื“ื•ื’ืžื”, ื™ืฉ ืจืฆืฃ ืฉืžืชื—ื™ืœ ื›ืš:

89, 93, 33, 32, 82, 21, 4, 42, 11, 8, 60, 95, 53, 30, 42, 19, 34, 35, 62, 23, 44, 38, 74, 36, 52, 18, 58, 79, 65, 45, 99, 90, 82, 20, 41, 13, 88, 76, 82, 24, 5, 54, 72, 19, 80, 2, 74, 36, 71, 9, ...

ืขื“ ื›ืžื” ื”ืžืกืคืจื™ื ื”ืืœื” ืืงืจืื™ื™ื ื‘ืžื‘ื˜ ืจืืฉื•ืŸ? ื ืชื—ื™ืœ ื‘ื‘ื“ื™ืงืช ื”ืชืคืœื’ื•ืช.
BlessRNG ืื• ื‘ื“ื™ืงืช ื”-RNG ืœื”ื’ื™ื ื•ืช
ื–ื” ื ืจืื” ืงืจื•ื‘ ืœืื—ื™ื“, ืื‘ืœ ืื ืืชื” ืงื•ืจื ืจืฆืฃ ืฉืœ ืฉื ื™ ืžืกืคืจื™ื ื•ืžืคืจืฉ ืื•ืชื ื›ืงื•ืื•ืจื“ื™ื ื˜ื•ืช ื‘ืžื™ืฉื•ืจ, ืืชื” ืžืงื‘ืœ ืืช ื–ื”:
BlessRNG ืื• ื‘ื“ื™ืงืช ื”-RNG ืœื”ื’ื™ื ื•ืช
ื“ืคื•ืกื™ื ื”ื•ืคื›ื™ื ื’ืœื•ื™ื™ื ื‘ื‘ื™ืจื•ืจ. ื•ืžื›ื™ื•ื•ืŸ ืฉื”ื ืชื•ื ื™ื ื‘ืจืฆืฃ ืžืกื•ื“ืจื™ื ื‘ืฆื•ืจื” ืžืกื•ื™ืžืช (ื›ืœื•ืžืจ, ื™ืฉ ืœื• ืื ื˜ืจื•ืคื™ื” ื ืžื•ื›ื”), ื–ื” ื™ื›ื•ืœ ืœื”ื•ืœื™ื“ ืืช ืื•ืชื” "ื”ื˜ื™ื”". ืœื›ืœ ื”ืคื—ื•ืช, PRNG ื›ื–ื” ืื™ื ื• ืžืชืื™ื ื‘ืžื™ื•ื—ื“ ืœื”ืคืงืช ืงื•ืื•ืจื“ื™ื ื˜ื•ืช ื‘ืžื™ืฉื•ืจ.

ืจืฆืฃ ื ื•ืกืฃ:

42, 72, 17, 0, 30, 0, 15, 9, 47, 19, 35, 86, 40, 54, 97, 42, 69, 19, 20, 88, 4, 3, 67, 27, 42, 56, 17, 14, 20, 40, 80, 97, 1, 31, 69, 13, 88, 89, 76, 9, 4, 85, 17, 88, 70, 10, 42, 98, 96, 53, ...

ื ืจืื” ืฉื”ื›ืœ ื‘ืกื“ืจ ื›ืืŸ ืืคื™ืœื• ื‘ืžื˜ื•ืก:
BlessRNG ืื• ื‘ื“ื™ืงืช ื”-RNG ืœื”ื’ื™ื ื•ืช
ื‘ื•ืื• ื ืกืชื›ืœ ื‘ื ืคื— (ืงืจื ืฉืœื•ืฉื” ืžืกืคืจื™ื ื‘ื›ืœ ืคืขื):
BlessRNG ืื• ื‘ื“ื™ืงืช ื”-RNG ืœื”ื’ื™ื ื•ืช
ื•ืฉื•ื‘ ื”ื“ืคื•ืกื™ื. ืœื ื ื™ืชืŸ ืขื•ื“ ืœื‘ื ื•ืช ื”ื“ืžื™ื” ื‘ืืจื‘ืขื” ืžื™ืžื“ื™ื. ืื‘ืœ ื“ืคื•ืกื™ื ื™ื›ื•ืœื™ื ืœื”ืชืงื™ื™ื ื‘ืžื™ืžื“ ื”ื–ื” ื•ื‘ื’ื“ื•ืœื™ื ื™ื•ืชืจ.

ื‘ืงืจื™ืคื˜ื•ื’ืจืคื™ื”, ืฉื‘ื” ื”ื“ืจื™ืฉื•ืช ื”ืžื—ืžื™ืจื•ืช ื‘ื™ื•ืชืจ ืžื•ื˜ืœื•ืช ืขืœ PRNGs, ืžืฆื‘ ื›ื–ื” ืื™ื ื• ืžืงื•ื‘ืœ ื‘ืื•ืคืŸ ืงื˜ื’ื•ืจื™. ืœื›ืŸ ืคื•ืชื—ื• ืืœื’ื•ืจื™ืชืžื™ื ืžื™ื•ื—ื“ื™ื ืœื”ืขืจื›ืช ืื™ื›ื•ืชื, ืฉืœื ื ื™ื’ืข ื‘ื”ื ื›ืขืช. ื”ื ื•ืฉื ื ืจื—ื‘ ื•ืจืื•ื™ ืœืžืืžืจ ื ืคืจื“.

ื‘ื“ื™ืงื”

ืื ืื ื—ื ื• ืœื ื™ื•ื“ืขื™ื ืžืฉื”ื• ื‘ื•ื•ื“ืื•ืช, ืื– ืื™ืš ืœืขื‘ื•ื“ ืื™ืชื•? ื”ืื ื›ื“ืื™ ืœื—ืฆื•ืช ืืช ื”ื›ื‘ื™ืฉ ืื ืœื ื™ื•ื“ืขื™ื ืื™ื–ื” ืจืžื–ื•ืจ ืžืืคืฉืจ ื–ืืช? ื”ื”ืฉืœื›ื•ืช ืขืฉื•ื™ื•ืช ืœื”ื™ื•ืช ืฉื•ื ื•ืช.

ืื•ืชื• ื“ื‘ืจ ืœื’ื‘ื™ ื”ืืงืจืื™ื•ืช ื”ื™ื“ื•ืขื” ืœืฉืžืฆื” ื‘ืื—ื“ื•ืช. ื–ื” ื˜ื•ื‘ ืื ื”ืชื™ืขื•ื“ ื—ื•ืฉืฃ ืืช ื”ืคืจื˜ื™ื ื”ื“ืจื•ืฉื™ื, ืื‘ืœ ื”ืกื™ืคื•ืจ ืฉื”ื•ื–ื›ืจ ื‘ืชื—ื™ืœืช ื”ืžืืžืจ ืงืจื” ื‘ื“ื™ื•ืง ื‘ื’ืœืœ ื”ื™ืขื“ืจ ื”ืคืจื˜ื™ื ื”ืจืฆื•ื™ื™ื.

ื•ืื ืืชื” ืœื ื™ื•ื“ืข ืื™ืš ื”ื›ืœื™ ืขื•ื‘ื“, ืœื ืชื•ื›ืœ ืœื”ืฉืชืžืฉ ื‘ื• ื ื›ื•ืŸ. ื‘ืื•ืคืŸ ื›ืœืœื™, ื”ื’ื™ืข ื”ื–ืžืŸ ืœื‘ื“ื•ืง ื•ืœืขืจื•ืš ื ื™ืกื•ื™ ื›ื“ื™ ืœื•ื•ื“ื ืกื•ืคื™ืช ืœืคื—ื•ืช ืœื’ื‘ื™ ื”ื”ืชืคืœื’ื•ืช.

ื”ืคืชืจื•ืŸ ื”ื™ื” ืคืฉื•ื˜ ื•ื™ืขื™ืœ - ืื™ืกื•ืฃ ื ืชื•ื ื™ื ืกื˜ื˜ื™ืกื˜ื™ื™ื, ื”ืฉื’ืช ื ืชื•ื ื™ื ืื•ื‘ื™ื™ืงื˜ื™ื‘ื™ื™ื ื•ื”ืชื‘ื•ื ื ื•ืช ื‘ืชื•ืฆืื•ืช.

ื ื•ืฉื ืœื™ืžื•ื“

ื™ืฉื ืŸ ืžืกืคืจ ื“ืจื›ื™ื ืœื™ืฆื•ืจ ืžืกืคืจื™ื ืืงืจืื™ื™ื ื‘-Unity - ื‘ื“ืงื ื• ื—ืžืฉ.

  1. System.Random.Next(). ื™ื•ืฆืจ ืžืกืคืจื™ื ืฉืœืžื™ื ื‘ื˜ื•ื•ื— ื ืชื•ืŸ ืฉืœ ืขืจื›ื™ื.
  2. System.Random.NextDouble(). ื™ื•ืฆืจ ืžืกืคืจื™ ื“ื™ื•ืง ื›ืคื•ืœื™ื ื‘ื˜ื•ื•ื— ืฉืœ [0; 1).
  3. UnityEngine.Random.Range(). ื™ื•ืฆืจ ืžืกืคืจื™ ื“ื™ื•ืง ื‘ื•ื“ื“ื™ื (ืฆืคื™ื) ื‘ื˜ื•ื•ื— ื ืชื•ืŸ ืฉืœ ืขืจื›ื™ื.
  4. UnityEngine.Random.value. ื™ื•ืฆืจ ืžืกืคืจื™ ื“ื™ื•ืง ื‘ื•ื“ื“ื™ื (ืฆืคื™ื) ื‘ื˜ื•ื•ื— ืฉืœ [0; 1).
  5. Unity.Mathematics.Random.NextFloat(). ื—ืœืง ืžืกืคืจื™ื™ืช Unity.Mathematics ื”ื—ื“ืฉื”. ื™ื•ืฆืจ ืžืกืคืจื™ ื“ื™ื•ืง ื‘ื•ื“ื“ื™ื (ืฆืคื™ื) ื‘ื˜ื•ื•ื— ื ืชื•ืŸ ืฉืœ ืขืจื›ื™ื.

ื›ืžืขื˜ ื‘ื›ืœ ืžืงื•ื ื‘ืชื™ืขื•ื“ ืฆื•ื™ื ื” ื”ืชืคืœื’ื•ืช ืื—ื™ื“ื”, ืœืžืขื˜ UnityEngine.Random.value (ืฉื ื”ื”ืชืคืœื’ื•ืช ืœื ืฆื•ื™ื ื”, ืื‘ืœ ื‘ืื ืœื•ื’ื™ื” ืœืžื“ื™ื ืฉืœ UnityEngine.Random.Range() ืฆืคื•ื™ื” ื’ื Unity.Mathematics.Random) .NextFloat() (ื›ืืฉืจ ื‘ื‘ืกื™ืก ื”ื•ื ืืœื’ื•ืจื™ืชื xorshift, ืžื” ืฉืื•ืžืจ ืฉืฉื•ื‘ ืฆืจื™ืš ืœื—ื›ื•ืช ืœื”ืชืคืœื’ื•ืช ืื—ื™ื“ื”).

ื›ื‘ืจื™ืจืช ืžื—ื“ืœ, ื”ืชื•ืฆืื•ืช ื”ืฆืคื•ื™ื•ืช ื ืœืงื—ื• ื›ืคื™ ืฉืฆื•ื™ื ื• ื‘ืชื™ืขื•ื“.

ืžืชื•ื“ื•ืœื•ื’ื™ื”

ื›ืชื‘ื ื• ืืคืœื™ืงืฆื™ื” ืงื˜ื ื” ืฉื™ืฆืจื” ืจืฆืคื™ื ืฉืœ ืžืกืคืจื™ื ืืงืจืื™ื™ื ื‘ื›ืœ ืื—ืช ืžื”ืฉื™ื˜ื•ืช ืฉื”ื•ืฆื’ื• ื•ืฉืžืจื ื• ืืช ื”ืชื•ืฆืื•ืช ืœืขื™ื‘ื•ื“ ื ื•ืกืฃ.

ืื•ืจื›ื• ืฉืœ ื›ืœ ืจืฆืฃ ื”ื•ื 100 ืžืกืคืจื™ื.
ื˜ื•ื•ื— ื”ืžืกืคืจื™ื ื”ืืงืจืื™ื™ื ื”ื•ื [0, 100).

ื”ื ืชื•ื ื™ื ื ืืกืคื• ืžืžืกืคืจ ืคืœื˜ืคื•ืจืžื•ืช ื™ืขื“:

  • Windows
    โ€” Unity v2018.3.14f1, ืžืฆื‘ ืขื•ืจืš, ืžื•ื ื•, .NET Standard 2.0
  • MacOS
    โ€” Unity v2018.3.14f1, ืžืฆื‘ ืขื•ืจืš, ืžื•ื ื•, .NET Standard 2.0
    โ€” Unity v5.6.4p4, ืžืฆื‘ ืขื•ืจืš, ืžื•ื ื•, .NET Standard 2.0
  • ืื ื“ืจื•ืื™ื“
    โ€” Unity v2018.3.14f1, ื‘ื ื™ื™ื” ืœื›ืœ ืžื›ืฉื™ืจ, ืžื•ื ื•, .NET Standard 2.0
  • iOS
    โ€” Unity v2018.3.14f1, ื‘ื ื™ื™ื” ืœื›ืœ ืžื›ืฉื™ืจ, il2cpp, .NET Standard 2.0

ะ ะตะฐะปะธะทะฐั†ะธั

ื™ืฉ ืœื ื• ื›ืžื” ื“ืจื›ื™ื ืฉื•ื ื•ืช ืœื™ืฆื•ืจ ืžืกืคืจื™ื ืืงืจืื™ื™ื. ืขื‘ื•ืจ ื›ืœ ืื—ื“ ืžื”ื, ื ื›ืชื•ื‘ ื›ื™ืชืช ืขื˜ื™ืคื” ื ืคืจื“ืช, ืฉืืžื•ืจื” ืœืกืคืง:

  1. ืืคืฉืจื•ืช ืœื”ื’ื“ื™ืจ ืืช ื˜ื•ื•ื— ื”ืขืจื›ื™ื [min/max). ื™ื•ื’ื“ืจ ื‘ืืžืฆืขื•ืช ื”ืงื•ื ืกื˜ืจื•ืงื˜ื•ืจ.
  2. ืฉื™ื˜ื” ืžื—ื–ื™ืจื” MF. ื‘ื•ืื• ื ื‘ื—ืจ ืœืฆื•ืฃ ื›ืกื•ื’, ืžื›ื™ื•ื•ืŸ ืฉื”ื•ื ื›ืœืœื™ ื™ื•ืชืจ.
  3. ืฉื ืฉื™ื˜ืช ื”ื“ื•ืจ ืœืกื™ืžื•ืŸ ื”ืชื•ืฆืื•ืช. ืžื˜ืขืžื™ ื ื•ื—ื•ืช, ื ื—ื–ื™ืจ ื›ืขืจืš ืืช ื”ืฉื ื”ืžืœื ืฉืœ ื”ืžื—ืœืงื” + ืฉื ื”ืฉื™ื˜ื” ื”ืžืฉืžืฉืช ืœื™ืฆื™ืจืช ื”-MF.

ืจืืฉื™ืช, ื‘ื•ืื• ื ื›ืจื™ื– ืขืœ ื”ืคืฉื˜ื” ืฉืชื•ืฆื’ ืขืœ ื™ื“ื™ ืžืžืฉืง IRandomGenerator:

namespace RandomDistribution
{
    public interface IRandomGenerator
    {
        string Name { get; }

        float Generate();
    }
}

ื™ื™ืฉื•ื ืฉืœ System.Random.Next()

ืฉื™ื˜ื” ื–ื• ืžืืคืฉืจืช ืœืš ืœื”ื’ื“ื™ืจ ื˜ื•ื•ื— ืฉืœ ืขืจื›ื™ื, ืื‘ืœ ื”ื™ื ืžื—ื–ื™ืจื” ืžืกืคืจื™ื ืฉืœืžื™ื, ืื‘ืœ ื™ืฉ ืฆื•ืจืš ื‘ืฆืคื™ื. ืืชื” ื™ื›ื•ืœ ืคืฉื•ื˜ ืœืคืจืฉ ืžืกืคืจ ืฉืœื ื›ืฆืฃ, ืื• ืฉืืชื” ื™ื›ื•ืœ ืœื”ืจื—ื™ื‘ ืืช ื˜ื•ื•ื— ื”ืขืจื›ื™ื ื‘ืžืกืคืจ ืกื“ืจื™ ื’ื•ื“ืœ, ื•ืœืคืฆื•ืช ืื•ืชื ืขื ื›ืœ ื“ื•ืจ ืฉืœ ื˜ื•ื•ื— ื”ื‘ื™ื ื™ื™ื. ื”ืชื•ืฆืื” ืชื”ื™ื” ืžืฉื”ื• ื›ืžื• ื ืงื•ื“ื” ืงื‘ื•ืขื” ืขื ืกื“ืจ ื“ื™ื•ืง ื ืชื•ืŸ. ืื ื• ื ืฉืชืžืฉ ื‘ืืคืฉืจื•ืช ื–ื• ืžื›ื™ื•ื•ืŸ ืฉื”ื™ื ืงืจื•ื‘ื” ื™ื•ืชืจ ืœืขืจืš ื”ืฆืฃ ื”ืืžื™ืชื™.

using System;

namespace RandomDistribution
{
    public class SystemIntegerRandomGenerator : IRandomGenerator
    {
        private const int DefaultFactor = 100000;
        
        private readonly Random _generator = new Random();
        private readonly int _min;
        private readonly int _max;
        private readonly int _factor;


        public string Name => "System.Random.Next()";


        public SystemIntegerRandomGenerator(float min, float max, int factor = DefaultFactor)
        {
            _min = (int)min * factor;
            _max = (int)max * factor;
            _factor = factor;
        }


        public float Generate() => (float)_generator.Next(_min, _max) / _factor;
    }
}

ื™ื™ืฉื•ื ืฉืœ System.Random.NextDouble()

ื›ืืŸ ื˜ื•ื•ื— ื”ืขืจื›ื™ื ื”ืงื‘ื•ืข [0; 1). ื›ื“ื™ ืœื”ืงืจื™ืŸ ืื•ืชื• ืขืœ ื–ื” ืฉืฆื•ื™ืŸ ื‘ื‘ื ืื™, ืื ื• ืžืฉืชืžืฉื™ื ื‘ื—ืฉื‘ื•ืŸ ืคืฉื•ื˜: X * (ืžืงืกื™ืžื•ื - ื“ืงื”) + ื“ืงื•ืช.

using System;

namespace RandomDistribution
{
    public class SystemDoubleRandomGenerator : IRandomGenerator
    {
        private readonly Random _generator = new Random();
        private readonly double _factor;
        private readonly float _min;


        public string Name => "System.Random.NextDouble()";


        public SystemDoubleRandomGenerator(float min, float max)
        {
            _factor = max - min;
            _min = min;
        }


        public float Generate() => (float)(_generator.NextDouble() * _factor) + _min;
    }
}

ื™ื™ืฉื•ื ืฉืœ UnityEngine.Random.Range()

ืฉื™ื˜ื” ื–ื• ืฉืœ ื”ืžื—ืœืงื” ื”ืกื˜ื˜ื™ืช UnityEngine.Random ืžืืคืฉืจืช ืœืš ืœื”ื’ื“ื™ืจ ื˜ื•ื•ื— ืฉืœ ืขืจื›ื™ื ื•ืžื—ื–ื™ืจื” ืกื•ื’ ืฆืฃ. ืื™ื ืš ืฆืจื™ืš ืœื‘ืฆืข ื˜ืจื ืกืคื•ืจืžืฆื™ื•ืช ื ื•ืกืคื•ืช.

using UnityEngine;

namespace RandomDistribution
{
    public class UnityRandomRangeGenerator : IRandomGenerator
    {
        private readonly float _min;
        private readonly float _max;


        public string Name => "UnityEngine.Random.Range()";


        public UnityRandomRangeGenerator(float min, float max)
        {
            _min = min;
            _max = max;
        }


        public float Generate() => Random.Range(_min, _max);
    }
}

ื™ื™ืฉื•ื ืฉืœ UnityEngine.Random.value

ืชื›ื•ื ืช ื”ืขืจืš ืฉืœ ื”ืžื—ืœืงื” ื”ืกื˜ื˜ื™ืช UnityEngine.Random ืžื—ื–ื™ืจื” ืกื•ื’ ืฆืฃ ืžื˜ื•ื•ื— ืงื‘ื•ืข ืฉืœ ืขืจื›ื™ื [0; 1). ื‘ื•ืื• ื ืฉืœื™ืš ืื•ืชื• ืขืœ ื˜ื•ื•ื— ื ืชื•ืŸ ื‘ืื•ืชื• ืื•ืคืŸ ื›ืžื• ื‘ืขืช ื™ื™ืฉื•ื System.Random.NextDouble().

using UnityEngine;

namespace RandomDistribution
{
    public class UnityRandomValueGenerator : IRandomGenerator
    {
        private readonly float _factor;
        private readonly float _min;


        public string Name => "UnityEngine.Random.value";


        public UnityRandomValueGenerator(float min, float max)
        {
            _factor = max - min;
            _min = min;
        }


        public float Generate() => (float)(Random.value * _factor) + _min;
    }
}

ื™ื™ืฉื•ื ืฉืœ Unity.Mathematics.Random.NextFloat()

ืฉื™ื˜ืช NextFloat() ืฉืœ ื”ืžื—ืœืงื” Unity.Mathematics.Random ืžื—ื–ื™ืจื” ื ืงื•ื“ื” ืฆืคื” ืžืกื•ื’ float ื•ืžืืคืฉืจืช ืœืš ืœืฆื™ื™ืŸ ื˜ื•ื•ื— ืฉืœ ืขืจื›ื™ื. ื”ื ื™ื•ืื ืก ื”ื™ื—ื™ื“ ื”ื•ื ืฉื›ืœ ืžื•ืคืข ืฉืœ Unity.Mathematics.Random ื™ืฆื˜ืจืš ืœื”ื™ื•ืช ืืชื—ื•ืœ ืขื ืื™ื–ื” ืกื™ื“ - ื›ืš ื ืžื ืข ืžื™ืฆื™ืจืช ืจืฆืคื™ื ื—ื•ื–ืจื™ื.

using Unity.Mathematics;

namespace RandomDistribution
{
    public class UnityMathematicsRandomValueGenerator : IRandomGenerator
    {
        private Random _generator;
        private readonly float _min;
        private readonly float _max;


        public string Name => "Unity.Mathematics.Random.NextFloat()";


        public UnityMathematicsRandomValueGenerator(float min, float max)
        {
            _min = min;
            _max = max;
            _generator = new Random();
            _generator.InitState(unchecked((uint)System.DateTime.Now.Ticks));
        }


        public float Generate() => _generator.NextFloat(_min, _max);
    }
}

ื”ื˜ืžืขืช MainController

ืžืกืคืจ ื™ื™ืฉื•ืžื™ื ืฉืœ IRandomGenerator ืžื•ื›ื ื™ื. ืœืื—ืจ ืžื›ืŸ, ืขืœื™ืš ืœื™ืฆื•ืจ ืจืฆืคื™ื ื•ืœืฉืžื•ืจ ืืช ืžืขืจืš ื”ื ืชื•ื ื™ื ื”ืžืชืงื‘ืœ ืœืขื™ื‘ื•ื“. ืœืฉื ื›ืš ื ื™ืฆื•ืจ ืกืฆื ื” ื•ืกืงืจื™ืคื˜ MainController ืงื˜ืŸ ื‘-Unity, ืฉื™ื‘ืฆืข ืืช ื›ืœ ื”ืขื‘ื•ื“ื” ื”ื ื“ืจืฉืช ื•ื‘ืžืงื‘ื™ืœ ื™ื”ื™ื” ืื—ืจืื™ ืขืœ ื”ืื™ื ื˜ืจืืงืฆื™ื” ืขื ื”-UI.

ื‘ื•ืื• ื ื’ื“ื™ืจ ืืช ื’ื•ื“ืœ ืžืขืจืš ื”ื ืชื•ื ื™ื ื•ืืช ื˜ื•ื•ื— ืขืจื›ื™ ื”-MF, ื•ื ืงื‘ืœ ื’ื ืฉื™ื˜ื” ืฉืžื—ื–ื™ืจื” ืžืขืจืš ืฉืœ ื’ื ืจื˜ื•ืจื™ื ืžื•ื’ื“ืจื™ื ื•ืžื•ื›ื ื™ื ืœืขื‘ื•ื“ื”.

namespace RandomDistribution
{
    public class MainController : MonoBehaviour
    {
        private const int DefaultDatasetSize = 100000;

        public float MinValue = 0f;
        public float MaxValue = 100f;

        ...

        private IRandomGenerator[] CreateRandomGenerators()
        {
            return new IRandomGenerator[]
            {
                new SystemIntegerRandomGenerator(MinValue, MaxValue),
                new SystemDoubleRandomGenerator(MinValue, MaxValue),
                new UnityRandomRangeGenerator(MinValue, MaxValue),
                new UnityRandomValueGenerator(MinValue, MaxValue),
                new UnityMathematicsRandomValueGenerator(MinValue, MaxValue)
            };
        }

        ...
    }
}

ืขื›ืฉื™ื• ื‘ื•ืื• ื ื™ืฆื•ืจ ืžืขืจืš ื ืชื•ื ื™ื. ื‘ืžืงืจื” ื–ื”, ื™ืฆื™ืจืช ื ืชื•ื ื™ื ื™ืฉื•ืœื‘ ืขื ื”ืงืœื˜ืช ื”ืชื•ืฆืื•ืช ืœื–ืจื ื˜ืงืกื˜ (ื‘ืคื•ืจืžื˜ csv). ื›ื“ื™ ืœืื—ืกืŸ ืืช ื”ืขืจื›ื™ื ืฉืœ ื›ืœ IRandomGenerator, ืžื•ืงืฆื” ืขืžื•ื“ื” ื ืคืจื“ืช ืžืฉืœื•, ื•ื”ืฉื•ืจื” ื”ืจืืฉื•ื ื” ืžื›ื™ืœื” ืืช ืฉื ื”ืžื—ื•ืœืœ.

namespace RandomDistribution
{
    public class MainController : MonoBehaviour
    {
        ...
		
        private void GenerateCsvDataSet(TextWriter writer, int dataSetSize, params IRandomGenerator[] generators)
        {
            const char separator = ',';
            int lastIdx = generators.Length - 1;

            // write header
            for (int j = 0; j <= lastIdx; j++)
            {
                writer.Write(generators[j].Name);
                if (j != lastIdx)
                    writer.Write(separator);
            }
            writer.WriteLine();

            // write data
            for (int i = 0; i <= dataSetSize; i++)
            {
                for (int j = 0; j <= lastIdx; j++)
                {
                    writer.Write(generators[j].Generate());
                    if (j != lastIdx)
                        writer.Write(separator);
                }

                if (i != dataSetSize)
                    writer.WriteLine();
            }
        }

        ...
    }
}

ื›ืœ ืžื” ืฉื ื•ืชืจ ื”ื•ื ืœืงืจื•ื ืœืฉื™ื˜ืช GenerateCsvDataSet ื•ืœืฉืžื•ืจ ืืช ื”ืชื•ืฆืื” ื‘ืงื•ื‘ืฅ, ืื• ืœื”ืขื‘ื™ืจ ืžื™ื“ ืืช ื”ื ืชื•ื ื™ื ื“ืจืš ื”ืจืฉืช ืžืžื›ืฉื™ืจ ื”ืงืฆื” ืœืฉืจืช ื”ืžืงื‘ืœ.

namespace RandomDistribution
{
    public class MainController : MonoBehaviour
    {
        ...
		
        public void GenerateCsvDataSet(string path, int dataSetSize, params IRandomGenerator[] generators)
        {
            using (var writer = File.CreateText(path))
            {
                GenerateCsvDataSet(writer, dataSetSize, generators);
            }
        }


        public string GenerateCsvDataSet(int dataSetSize, params IRandomGenerator[] generators)
        {
            using (StringWriter writer = new StringWriter(CultureInfo.InvariantCulture))
            {
                GenerateCsvDataSet(writer, dataSetSize, generators);
                return writer.ToString();
            }
        }

        ...
    }
}

ืžืงื•ืจื•ืช ื”ืคืจื•ื™ืงื˜ ื ืžืฆืื™ื ื‘ GitLab.

ืžืžืฆืื™ื

ืฉื•ื ื ืก ืœื ืงืจื”. ืžื” ืฉื”ื ืฆื™ืคื• ื–ื” ืžื” ืฉื”ื ืงื™ื‘ืœื• - ื‘ื›ืœ ื”ืžืงืจื™ื, ื”ืคืฆื” ืฉื•ื•ื” ื‘ืœื™ ืฉืžืฅ ืฉืœ ืงื•ื ืกืคื™ืจืฆื™ื•ืช. ืื ื™ ืœื ืจื•ืื” ื˜ืขื ืœืฉื™ื ื’ืจืคื™ื ื ืคืจื“ื™ื ืœืคืœื˜ืคื•ืจืžื•ืช - ื›ื•ืœื ืžืฆื™ื’ื™ื ื‘ืขืจืš ืืช ืื•ืชืŸ ืชื•ืฆืื•ืช.

ื”ืžืฆื™ืื•ืช ื”ื™ื:
BlessRNG ืื• ื‘ื“ื™ืงืช ื”-RNG ืœื”ื’ื™ื ื•ืช

ื”ื“ืžื™ื” ืฉืœ ืจืฆืคื™ื ื‘ืžื™ืฉื•ืจ ืžื›ืœ ื—ืžืฉ ืฉื™ื˜ื•ืช ื”ื“ื•ืจ:
BlessRNG ืื• ื‘ื“ื™ืงืช ื”-RNG ืœื”ื’ื™ื ื•ืช

ื•ื”ื“ืžื™ื” ื‘ืชืœืช ืžื™ืžื“. ืืฉืื™ืจ ืจืง ืืช ื”ืชื•ืฆืื” ืฉืœ System.Random.Next() ื›ื“ื™ ืœื ืœื™ื™ืฆืจ ื—ื‘ื•ืจื” ืฉืœ ืชื•ื›ืŸ ื–ื”ื”.
BlessRNG ืื• ื‘ื“ื™ืงืช ื”-RNG ืœื”ื’ื™ื ื•ืช

ื”ืกื™ืคื•ืจ ืฉืกื•ืคืจ ื‘ื”ืงื“ืžื” ืขืœ ื”ื”ืชืคืœื’ื•ืช ื”ื ื•ืจืžืœื™ืช ืฉืœ UnityEngine.Random ืœื ื—ื–ืจ ืขืœ ืขืฆืžื•: ืื• ืฉื”ื•ื ื”ื™ื” ืฉื’ื•ื™ ื‘ื”ืชื—ืœื”, ืื• ืฉืžืฉื”ื• ื”ืฉืชื ื” ืžืื– ื‘ืžื ื•ืข. ืื‘ืœ ืขื›ืฉื™ื• ืื ื—ื ื• ื‘ื˜ื•ื—ื™ื.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”