24 / 22 / 3
Регистрация: 25.12.2011
Сообщений: 65
1

Сгенерировать 5 случайных чисел так, чтобы их сумма была равна заданному числу

06.04.2012, 02:48. Показов 16797. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет. Необходимо сгенерировать и сохранить в массив 5 случайных чисел, но так, чтобы их сумма была равна заданному числу, например 100. Мой вариант решения получился слишком громоздким, хотелось бы увидеть другие.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.04.2012, 02:48
Ответы с готовыми решениями:

Сгенерировать массив из 0, 1, 2 так, что бы сумма чисел была равна 12
Здравствуйте. Нужно сгенерировать массив из 0, 1, 2 так, что бы сумма чисел была равна 12. Вот мой...

Сгенерировать набор случайных чисел, чтобы их сумма была равна заданному числу n
Доброго времени суток!) Помогите пожалуйста. Нужно сгенерировать набор случайных чисел, чтобы их...

Замените звездочки цифрами так, чтобы сумма любых трёх соседних цифр была равна заданному числу
Тема: Указатели и ссылки. Задание: В числе 7 ****** 1 замените звездочки цифрами так, чтобы...

В дереве найти такой пусть, чтобы сумма узлов была равна заданному числу
Задача: В дереве найти такой пусть, чтобы сумма узлов была равна 50. В целом, понятно. У меня...

6
20 / 19 / 0
Регистрация: 04.04.2012
Сообщений: 31
06.04.2012, 03:06 2
Ну, самый негромоздкий из возможных вариантов - в цикле генерировать пять чисел и проверять, равна ли их сумма заданному числу. Если равна, выходить из цикла. Но количество итераций при таком подходе будет стремиться к бесконечности.
Числа должны быть случайными в каком диапазоне?
0
Эксперт .NET
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
06.04.2012, 04:51 3
Я бы как-то так сделал:
C#
1
2
3
4
5
6
7
8
9
var randoms = new int[5];
var random = new Random();
int sum = 100;
 
for (int i = 0; i < randoms.Length - 1; i++) {
    randoms[i] = random.Next(sum);
    sum -= randoms[i];
}
randoms[randoms.Length - 1] = sum;
Суть в том, что на каждой итерации генерируется случайное число в диапазоне от 0 до остатка от общей суммы.

Метод, конечно, далеко не идеален (особенно будет заметно на больших массивах), но копать надо в этом направлении, как мне кажется.
2
24 / 22 / 3
Регистрация: 25.12.2011
Сообщений: 65
06.04.2012, 12:51  [ТС] 4
Цитата Сообщение от Aexx Посмотреть сообщение
Ну, самый негромоздкий из возможных вариантов - в цикле генерировать пять чисел и проверять, равна ли их сумма заданному числу. Если равна, выходить из цикла. Но количество итераций при таком подходе будет стремиться к бесконечности.
Числа должны быть случайными в каком диапазоне?
Ну теоретически, такая генерация может длиться целый день, поэтому я сразу отказался от этого метода. Диапазон не важен, но числа не должны быть равны 0 (извиняюсь, забыл об этом написать в условии)

kolorotur, хороший вариант, попробую.

п.с. Если будут еще варианты или идеи, пишите.
0
Эксперт Java
4091 / 3825 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
06.04.2012, 13:14 5
линк на stackoverflow
Код
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public static  void Main()
        {
            Random r = new Random();
            int requiredSumm = 100;
 
            int[] randoms = new int[5];
            double actualSumm = 0;
 
            //Просто генерируем случайные числа, и считаем сумму
            for (int i = 0; i < randoms.Length; i++)
            {
                randoms[i] = r.Next();
                actualSumm += randoms[i];
            }
 
            //Пропорционально изменяем в соответствии с нужной суммой
            for (int i = 0; i < randoms.Length; i++)
            {
                randoms[i] = (int) (randoms[i] * (requiredSumm / actualSumm));
            }
 
            //Считаем новую сумму - она окажется ниже требуемой
            int newActualSum = 0;
            foreach (int random in randoms)
            {
                newActualSum += random;
            }
 
            //Теперь осталось выбрать (requiredSumm - newActualSum) чисел для увеличения на 1
            HashSet<int> increased = new HashSet<int>();
            for (int i = 0; i < requiredSumm - newActualSum; i++)
            {
                int index;
                do
                {
                    index = r.Next(randoms.Length);
                } while (!increased.Add(index));
                randoms[index]++;
            }
 
            newActualSum = 0;
            foreach (int random in randoms)
            {
                Console.WriteLine(random);
                newActualSum += random;
            }
 
            Console.WriteLine(newActualSum);
            Console.ReadKey();
        }

Код можно укоротить за счет LINQ.


PS. Есть шанс, что код не заработает. Один раз на 0x7fffffff5 запусков.
1
12 / 12 / 2
Регистрация: 28.03.2012
Сообщений: 49
06.04.2012, 13:31 6
не знаю насколько правильно но из десяти запусков 10 в точку
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private void Random1()
        {
            int[] aRand = new int[5];
            int n = 5;
            int sum = 0;
            int max = 100;
            for (int i = 0; i < n - 1; i++)
            {
                aRand[i] = rnd.Next(max / n);
                sum += aRand[i];
            }
            aRand[4] = max - sum;
            sum += aRand[4];
            MessageBox.Show(aRand[0].ToString() + "; " + 
                aRand[1].ToString() + "; " + 
                aRand[2].ToString() + "; " + 
                aRand[3].ToString() + "; " + 
                aRand[4].ToString() + "; " + 
                "sum == " + sum.ToString());
        }
1
Эксперт Java
4091 / 3825 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
06.04.2012, 14:01 7
Цитата Сообщение от project.web Посмотреть сообщение
не знаю насколько правильно но из десяти запусков 10 в точку
У вас не равномерное распределение получается. Последнее число всегда будет больше остальных.

Добавлено через 22 минуты
Не могу придумать как последний цикл правильно упростить:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public static  void Main()
        {
            Random r = new Random();
            int requiredSumm = 100;
 
            //Просто генерируем случайные числа, и считаем сумму
            int[] randoms = Enumerable.Range(0, 5).Select(e => r.Next()).ToArray();
            double actualSumm = randoms.Sum(i => (double)i);
 
            //Пропорционально изменяем в соответствии с нужной суммой
            randoms = randoms.Select(i => (int)(i * (requiredSumm / actualSumm))).ToArray();
 
            //Считаем новую сумму - она окажется ниже требуемой
            int newActualSum = randoms.Sum();
 
            //Теперь осталось выбрать (requiredSumm - newActualSum) чисел для увеличения на 1
            HashSet<int> increased = new HashSet<int>();
            for (int i = 0; i < requiredSumm - newActualSum; i++)
            {
                int index;
                do
                {
                    index = r.Next(randoms.Length);
                } while (!increased.Add(index));
                randoms[index]++;
            }
 
            foreach (int random in randoms)
                Console.WriteLine(random);
 
            Console.WriteLine(randoms.Sum());
            Console.ReadKey();
        }
1
06.04.2012, 14:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.04.2012, 14:01
Помогаю со студенческими работами здесь

Можно ли в данном массиве выбрать какие-либо элементы, чтобы их сумма была равна заданному числу?
Ребята помогите решить задачу срочно плиззз. Дан массив, состоящий из целых чисел, а также...

Можно ли создать n заданных рандомных чисел, чтобы из сумма была равна какому либо определённому числу
Интересен вопрос. Можно ли создать n заданных рандомных чисел, чтобы из сумма была равна какому...

Можно ли перед каждым из чисел от 1 до N расставить знаки «+» или «–» так, чтобы сумма получившихся чисел была равна 0?
Легенда гласит, что Карл Фридрих Гаусс, учась в школе, смог быстро посчитать сумму целых чисел от 1...

Можно ли перед каждым из чисел от 1 до N расставить знаки «+» или «–» так, чтобы сумма получившихся чисел была равна 0?
Решить пробовал , но это не о чем , не одного правильного вывода не было , окало часа шаманил , но...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru