Форум программистов, компьютерный форум, киберфорум
.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
evgenybe

Сгенерировать 4 случайных числа из заданного диапазона

06.09.2011, 20:09. Показов 2234. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
VB.NET
1
2
3
4
5
6
7
8
9
10
' Разыгрываем 4 случайных номера:
dim Num as integer = 6000
Randomize()
arrNum(0) = Int((Num * Rnd()) + 1)
Randomize()
arrNum(1) = Int((Num * Rnd()) + 1)
Randomize()
arrNum(2) = Int((Num * Rnd()) + 1)
Randomize()
arrNum(3) = Int((Num * Rnd()) + 1)
Этот код работает при перезагрузке страницы и должен каждый раз давать разный набор из 4-х чисел. Но фактически он идет по какому то заколдованному кругу, повторяющемуся через 5 или 6 перезагрузок.
А мне надо чтобы повторов практически не было. Или чтобы были, но крайне редко.
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.09.2011, 20:09
Ответы с готовыми решениями:

Вывести в консоль числа из заданного диапазона
Как сдилать счет чысел от 1 до 6тыщ?И писать это в консоль окно

Сгенерировать массив, содержащий 40 целых случайных значений из заданного диапазона
1) Написать программу на языке Pascal, которая генерирует массив, содержащий 40 целых случайных значений из заданного диапазона (при...

Сгенерировать последовательность десяти случайных целых чисел из диапазона
Как сгенерировать последовательность десяти случайных целых чисел из диапазона и записать её в массив размером 1х10?

12
86 / 62 / 69
Регистрация: 15.03.2007
Сообщений: 6,903
07.09.2011, 10:40
Попробуйте вызывать Randomize() только один раз в начале страницы или используйте класс RNGCryptoServiceProvider из пространтства имен System.Security.Cryptography.
0
evgenybe
08.09.2011, 02:42
Можешь привести пример, как этим пользоваться?
0 / 0 / 0
Регистрация: 01.11.2010
Сообщений: 177
10.09.2011, 17:00
Попробовал использовать Randomize() только один раз в начале страницы. Не помогло. Эффект тот же самый.
А с RNGCryptoServiceProvider я так и не разобрался, как же им воспользоваться. Вот ежели бы маленький примерчик. Пару строчек кода.

Спасибо.
0
86 / 62 / 69
Регистрация: 15.03.2007
Сообщений: 6,903
11.09.2011, 12:15
Вот пример. Идея в том что значение переменной типа int формируется из 4-х байтов путем сложения и сдвигов байтов влево.
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
using System;
using System.Security.Cryptography;
 
public class ConsoleApp
{
    public static int Main(string[] argv)
    {
        RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
 
        byte[] random_bytes = new Byte[4*4];
        rng.GetBytes(random_bytes);
        int[] random_ints = byteArrayToIntArray(random_bytes, 6000);
 
        for (int i=0; i<random_ints.Length; i++)
        {
            Console.WriteLine(random_ints[i]);
        }
 
        return 0;
    }
 
    public static int[] byteArrayToIntArray(byte[] srcArray, int maxValue)
    {
        if (null == srcArray) return null;
        // Длина массива должна быть кратна 4
        if (0 != srcArray.Length%4) throw new InvalidOperationException();
 
        int[] tarArray = new int[srcArray.Length/4];
        for (int i=0, j=0; i<srcArray.Length; i+=4, j++)
        {
            int v = srcArray[i] + (srcArray[i+1] << 8) + (srcArray[i+2] << 16) + (srcArray[i+3] << 24);
            if (v < 0) v = -v;
            tarArray[j] = v % maxValue;
 
        }
 
        return tarArray;
    }
}
0
evgenybe
12.09.2011, 19:45
А как это будет выглядеть в Visual Basic?
86 / 62 / 69
Регистрация: 15.03.2007
Сообщений: 6,903
13.09.2011, 10:38
Самостоятельно перепишите. У меня сейчас, к сожалению, нет на это времени.
0
0 / 0 / 0
Регистрация: 01.11.2010
Сообщений: 177
21.09.2011, 12:06
Создал класс с твоим кодом.
В странице создаю объект этого класса, но не могу понять, как же им воспользоваться. Делаю вот так
VB.NET
1
2
3
4
5
6
    Private Sub btnRandom_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRandom.Click
        Dim oRnd As New clRandom
        Dim srcArray(63) As Byte
        Dim i(3) As Integer
        i = oRnd.byteArrayToIntArray(srcArray, 4000)
    End Sub
и получаю все значения в массиве i - нули.
Что я сделал неправильно?
0
Messir
21.09.2011, 12:15
> Что я сделал неправильно?
1. не удосужился почитать про объявления массивов.

надо хотя бы так:
VB.NET
1
2
Dim srcArray(64) As Byte
Dim i As Integer()
кстати, это объявление на случай, если тебе 16 интов нужно. зачем тебе их так много?

2. не проинициализировал массив srcArray
0 / 0 / 0
Регистрация: 01.11.2010
Сообщений: 177
21.09.2011, 12:32
Вот так уже лучше:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    Private Sub btnRandom_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRandom.Click
        Dim oRnd As New clRandom
        Dim srcArray(15) As Byte
        Dim k As Integer
        For k = 0 To 15
            srcArray(k) = k
        Next
        Dim i As Integer()
        i = oRnd.byteArrayToIntArray(srcArray, 4000)
        Label1.Text = i(0)
        Label2.Text = i(1)
        Label3.Text = i(2)
        Label4.Text = i(3)
    End Sub
Но получаю каждый раз один и тот же набор 2976, 3012, 3048, 3084
Что у меня еще не так?
0
86 / 62 / 69
Регистрация: 15.03.2007
Сообщений: 6,903
21.09.2011, 12:49
> Но получаю каждый раз один и тот же набор 2976, 3012, 3048, 3084
Функция byteArrayToIntArray всего лишь переводит массив исходный байтов в массив integer-ов. Вы заполняете массив srcArray одними и теми же значениями от 0 до 15 и именно поэтому получаете всегда одинаковый результат.

Мой пример это консольная программа и метод Main в ней вызывается автоматически при запуске программы. В приложении ASP.NET это не происходит.

Переделайте Main так чтобы она принимала аргументы кол-во нужных случайных чисел (count) и максимальное значение (maxValue), а возвращала массив integer. Аргумент count должен использоваться при выделении памяти под массив байтов. Примерно так
byte[] random_bytes = new Byte[count*4];
Аргумент maxValue передается функции byteArrayToIntArray.
0
0 / 0 / 0
Регистрация: 01.11.2010
Сообщений: 177
21.09.2011, 15:07
bazile > Огромное спасибо!
Ниже привожу окончательное решение (для тех, кому это интересно):
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
using System;
using System.Security.Cryptography;
 
namespace ns_Random
{
    public class clRandom
    {  
        public static int[] Main(int count, int maxValue)  
        {    
            RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();    
            byte[] random_bytes = new Byte[count*4];    
            rng.GetBytes(random_bytes);    
            int[] random_ints = byteArrayToIntArray(random_bytes, maxValue);    
            /*
            for (int i=0; i<random_ints.Length; i++)    
            {      
                Console.WriteLine(random_ints[i]);    
            }    
            */  
            return random_ints;  
        } 
 
        public static int[] byteArrayToIntArray(byte[] srcArray, int maxValue)  
        {    
            if (null == srcArray) return null;    
            // Длина массива должна быть кратна 4    
            if (0 != srcArray.Length%4) 
                throw new InvalidOperationException();    
            int[] tarArray = new int[srcArray.Length/4];    
            for (int i=0, j=0; i<srcArray.Length; i+=4, j++)    
            {      
                int v = srcArray[i] + (srcArray[i+1] << 8) + (srcArray[i+2] << 16) + (srcArray[i+3] << 24);      
                if (v < 0) v = -v;      
                tarArray[j] = v % maxValue;    
            }    
            return tarArray;  
        }
    }
}
А вот так пользуюсь:
VB.NET
1
2
3
4
5
6
7
8
9
    Private Sub btnRandom_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRandom.Click
        Dim oRnd As New clRandom
        Dim i As Integer()
        i = oRnd.Main(4, 6000)
        Label1.Text = i(0)
        Label2.Text = i(1)
        Label3.Text = i(2)
        Label4.Text = i(3)
    End Sub
0
86 / 62 / 69
Регистрация: 15.03.2007
Сообщений: 6,903
21.09.2011, 15:21
Нет никакого смысла использовать префиксы ns и cl в начале названий пространств имен и классов. Методу Main также лучше дать более понятное название.

Так как все методы класса статеческие, то незачем создавать экземпляр данного класса для работы с ним. Более того чтобы не вводить пользователя класса в заблуждение лучше эту возможность вообще запретить путем объявление закрытого конструктора. Из последнего также следует что класс не предназначен для наследования и, следовательно, должен быть объявлен как sealed.

Вот более правильный вариант класса:
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
using System;
using System.Security.Cryptography;
 
namespace Random
{
    public sealed class RandomSequence
    {
        private RandomSequence()
        {
        }
        
        public static int[] Generate(int count, int maxValue)
        {
            RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
            byte[] random_bytes = new Byte[count*4];
            rng.GetBytes(random_bytes);
            return byteArrayToIntArray(random_bytes, maxValue);
        }
 
        private static int[] byteArrayToIntArray(byte[] srcArray, int maxValue)
        {
            if (null == srcArray) return null;
            // Длина массива должна быть кратна 4
            if (0 != srcArray.Length%4)
                throw new InvalidOperationException();
            int[] tarArray = new int[srcArray.Length/4];
            for (int i=0, j=0; i&lt;srcArray.Length; i+=4, j++)
            {
                int v = srcArray[i] + (srcArray[i+1] &lt;&lt; 8) + (srcArray[i+2] &lt;&lt; 16) + (srcArray[i+3] &lt;&lt; 24);
                if (v &lt; 0) v = -v;
                tarArray[j] = v % maxValue;
            }
            return tarArray;
        }
    }
}
Пользуемся так:
VB.NET
1
2
3
4
5
6
Dim i As Integer()
i = RandomSequence.Generate(4, 6000)
Label1.Text = i(0)
Label2.Text = i(1)
Label3.Text = i(2)
Label4.Text = i(3)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.09.2011, 15:21
Помогаю со студенческими работами здесь

Сгенерировать списки-палиндромы, состоящие из чисел из заданного диапазона
Кто-нибудь знает как сгенерировать списки-палиндромы, состоящие из чисел из заданного диапазона?

Из заданного диапазона выбрать 5 случайных чисел
Начальная версия: Задача такая: надо из задонова диапозона (допустим от1 до 50) выбрать (допустим 5 случайных чисел) и проделать это...

Генерация случайных чисел из заданного диапазона
как сделать рандом из определенного интервала? т.е if (x&gt;0.15 &amp;&amp; y&lt;0.456) z=//z принимает значения из этого интервала

Сгенерировать массив, содержащий 40 целых случайных значений из заданного набора
Написать программу на языке Pascal, которая генерирует массив, содержащий 40 целых случайных значений из заданного набора (при выводе...

Формула для генерации случайных чисел заданного диапазона
srand(time(NULL)); int massize = 3; int mas; for (int i = 0; i &lt; massize; i++) { for (int b = 0; b &lt; massize; b++) { ...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru