Хобрук: Ваш путь к мастерству в программировании

Неповторяющееся целое число в пределах диапазона (исключая 0) создает повторяющуюся целочисленную последовательность

Ссылаясь на генерацию случайных чисел без последовательного повторения, я хочу сделать не- повторяющийся генератор случайных целых чисел, но от 2 до 9 включительно.

Я хорошо использую код упаковки из ответа в приведенном выше URL-адресе.

int oldrand = <prior random number>;
int adder = randomNumberGenerator() % 4;
int newrand = (oldrand + adder + 1) % 5;

Мой код, однако,

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Threading;

namespace Rextester
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Random Rand = new Random();
            int oldrand = Rand.Next(0,7);
            //Console.WriteLine(oldrand);
            for (int i=0; i<50;i++) {

            int adder = Rand.Next(0,7) % 7;
            int newrand = (oldrand + adder + 1) % 8+2;
            int newrand2 = (newrand + adder + 1) % 8+2;
            int newrand3 = (newrand2 + adder + 1) % 8+2;
            int newrand4 = (newrand3 + adder + 1) % 8+2;

            Console.WriteLine(newrand);
            Console.WriteLine(newrand2);
            Console.WriteLine(newrand3);
            Console.WriteLine(newrand4);
            oldrand = newrand4;
            Console.WriteLine();
            }
        }
    }

    public class Rand {
        private static readonly Random globalRandom = new Random(); 
        private static readonly object globalLock = new object();

        private static readonly ThreadLocal<Random> threadRandom = new ThreadLocal<Random>(NewRandom);

        public static Random NewRandom() 
        { 
            lock (globalLock) 
            { 
                return new Random(globalRandom.Next()); 
            } 
        }

        public static Random Instance { get { return threadRandom.Value; } }

        public static int Next(int minValue, int maxValue) 
        { 
            return Instance.Next(minValue, maxValue); 
        }

    }
}

выдает странный результат:

2
7
4
9

2
3
4
5

2
7
4
9

5
9
5
9

8
7
6
5

3
9
7
5

2
7
4
9

5
9
5
9

5
9
5
9

9
9
9
9

5
9
5
9

7
5
3
9

8
7
6
5

3
9
7
5

9
5
9
5

4
3
2
9

6
3
8
5

2
7
4
9

6
3
8
5

9
5
9
5

Как вы можете видеть, 5 и 9 повторяются как шаблон, в то время как в другой последовательности вы видите все четыре девятки.

16.03.2017

  • Не уверен, почему вы делаете 4 newrand за цикл, но если вы действительно хотите создать 4 сэмпла за цикл, вы должны регенерировать adder между каждым - в противном случае вы неправильно следуете шаблону. 16.03.2017
  • Как часто это приводит к такому результату? 16.03.2017

Ответы:


1

Проблема с вашим кодом заключается в том, что вам нужно выбрать новое случайное число для каждого нового случайного числа, которое вы хотите. Ваш код повторно использует одно случайное число снова и снова, поэтому вы просто получаете математически предсказуемую последовательность, и в зависимости от того, с чего вы начнете, вы получите дубликаты.

Вот версия кода, который работает (и тестирует результаты, он также написан так, как я думаю, гораздо более читабельный, пригодный для повторного использования и понятный):

    static void Main(string[] args)
    {
        Random random = new Random();
        const int max = 8;

        for (int i = 0; i < 50; i++)
        {
            int[] sequence =
                GetRandomNonConsecutiveSequence(random, max, 4)
                .Select(j => j + 2)
                .ToArray();

            if (!CheckSequence(sequence))
            {
                Console.WriteLine("Sequence failed: " + string.Join(", ", sequence));
            }
        }
    }

    private static bool CheckSequence(int[] sequence)
    {
        int previous = sequence[0];

        for (int i = 1; i < sequence.Length; i++)
        {
            if (previous == sequence[i])
            {
                return false;
            }

            previous = sequence[i];
        }

        return true;
    }

    private static IEnumerable<int> GetRandomNonConsecutiveSequence(
        Random random, int max, int count)
    {
        int previous = random.Next(max);

        yield return previous;

        while (--count > 0)
        {
            yield return previous = Next(previous, max, random);
        }
    }

    static int Next(int previous, int max, Random random)
    {
        return (previous + random.Next(max - 1) + 1) % max;
    }
16.03.2017
  • Я не совсем понимаю часть IEnumerable, так как я все еще учусь. Не могли бы вы уточнить код? Спасибо! 18.03.2017
  • Новые материалы

    Декларативное и функциональное программирование в стиле LINQ с использованием JavaScript с использованием каррирования и генератора ...
    LINQ - одна из лучших функций C #, которая обеспечивает элегантный способ написания кода декларативного и функционального стиля, который легко читать и понимать. Благодаря таким функциям ES6,..

    Структуры данных в C ++ - Часть 1
    Реализация общих структур данных в C ++ C ++ - это расширение языка программирования C, которое поддерживает создание классов, поэтому оно известно как C с классами . Он используется для..

    Как я опубликовал свое первое приложение в App Store в 13 лет
    Как все началось Все началось три года назад летом после моего четвертого класса в начальной школе. Для меня, четвертого класса, лето кажется бесконечным, пока оно не закончится, и мой отец..

    Что в лицо
    Очерк о возвращении физиогномики и о том, почему мы должны это приветствовать. История начинается со странной науки. Р. Тора Бьорнсдоттир, Николас О. Рул. Видимость социального класса по..

    Почему шаблоны проектирования и почему нет?
    Сложность — мать всех проблем в программировании. Программное обеспечение должно быть разработано с точки зрения того, кто его поддерживает, а не того, кто его пишет, потому что программное..

    Создание дизайна обуви с помощью машинного обучения
    Обувь. Что подождать? Я думал, что речь пойдет о машинном обучении! Ну это так. Если бы вы пошли на Amazon, сколько обуви вы бы нашли? Наверное, много, не так ли? Но много ли в них..

    GraalVM в 2022 году: итоги года
    2022 год был очень продуктивным для проекта и сообщества GraalVM. Вместе мы разработали множество новых функций, выпустили GraalVM для последних версий Java и новых платформ и увидели несколько..