Страница: 1 | 2 |
Вопрос: Random
Добавлено: 23.04.07 00:10
Автор вопроса: BG(Алексей)
Мне нужно, что бы числа в строке не повторялись.
Почему в строке, иногда, повторяються сгенерированные числа, что я делаю не правильно?
Dim ss, s As Byte
For ss = 0 To 10
For s = 0 To 4
Randomize()
arrS(ss, s) = CInt(Int(10 * Rnd() + 1))
Next
Next
Ответы
Всего ответов: 20
Номер ответа: 1
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #1
Добавлено: 23.04.07 00:36
Randomize инициализирует генератор случайных чисел таймером.
Судя по всему во время выполнения цикла значение таймера не успевает измениться поэтому каждый раз генератор инициализируется одним и тем же числом, поэтому и числа генерируются одинаковые.
Вобщем перенеси Randomize в самое начало процедуры.
Вот рабочий код, написанный на VB .NET (а не VB .NET like VB6)
Dim Random As New Random
For i As Integer = 0 To 10
For j As Integer = 0 To 4
Arr(i, j) = Random.Next(1, 11)
Next
Next
Обрати внимание - класс Random ничем не инициализируем - по умолчанию он сам инициализируется таймером
Номер ответа: 2
Автор ответа:
BG(Алексей)
Вопросов: 26
Ответов: 295
Профиль | | #2
Добавлено: 23.04.07 01:07
Спасибо, сейчас попробую.
Номер ответа: 3
Автор ответа:
BG(Алексей)
Вопросов: 26
Ответов: 295
Профиль | | #3
Добавлено: 23.04.07 01:20
Попробовал, вот результат.
1) 4,3,4,7,2
2) 8,8,8,4,6
3) 5,5,5,10,8
и так далее.
Почти в каждой строчке повторяються числа.
Как с этим бороться?
Номер ответа: 4
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #4
Добавлено: 23.04.07 01:56
Dim Random As New Random
For i As Integer = 0 To 10
For j As Integer = 0 To 4
Arr(i, j) = Random.Next(1, 11)
Console.Write(Arr(i, j).ToString + ControlChars.Tab)
Next
Console.WriteLine()
Next
Console.ReadLine()
7 10 6 3 3
8 3 6 3 1
9 9 3 2 2
5 10 5 6 3
3 9 9 2 1
7 7 7 4 5
9 7 7 3 2
5 3 8 5 9
9 1 2 5 8
5 9 4 6 8
Что тебя не устраивает?
Вероятность того что рядом будут идти 2 одинаковых числа - 1/10. Хочешь чтоб вероятность была меньше, генерируй от 1 до 100
Номер ответа: 5
Автор ответа:
BG(Алексей)
Вопросов: 26
Ответов: 295
Профиль | | #5
Добавлено: 23.04.07 02:05
В одной строке два одинаковых числа исключено.
Генерировать я должен от 1 до 50.
Дополнительный вопрос:
Можно ли сделать так, чтоб в одной строке все цифры шли по возрастанию. Это для того, что бы в дальнейшем избежать сортировки.
Номер ответа: 6
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #6
Добавлено: 23.04.07 02:17
Мне кажеться, если такое грубое условие
Номер ответа: 7
Автор ответа:
BG(Алексей)
Вопросов: 26
Ответов: 295
Профиль | | #7
Добавлено: 23.04.07 02:36
Да, наверно так и прийдётся делать.
Но от этого упадет проиводительность, ведь строчек может быть около 15000.
Номер ответа: 8
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #8
Добавлено: 23.04.07 02:42
Если бы ты с самого начала объяснил что тебе нужно, было бы намного проще.
Что за задача стоит?
Номер ответа: 9
Автор ответа:
BG(Алексей)
Вопросов: 26
Ответов: 295
Профиль | | #9
Добавлено: 23.04.07 02:57
Сразу и по порядку.
Делаю MDI приложение.
Работать оно будет исключительно с цифрами от 1 до 200.
Все номера беруться из БД в массив, а потом в разных окнах идет работа с ними ( делятся на массивы, на группы, на подгруппы и тд).
Но я должен (иногда) управлять ими, а именно генерировать новые значения. Вообщем Бред сумашедшего.
Но самое главное, это то, что я абссолютный начинающий, учусь по книге Шевякова, Степанова, Карпова "Самоучитель Visual Basic 2005".
Когда захожу в тупик, обращаюсь к Вам. За объяснениями.
Номер ответа: 10
Автор ответа:
BG(Алексей)
Вопросов: 26
Ответов: 295
Профиль | | #10
Добавлено: 23.04.07 03:40
Сделал, всё работает.
Но хотелось бы по-короче.
Всем спасибо.
Номер ответа: 11
Автор ответа:
VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #11
Добавлено: 23.04.07 13:54
Здо вы паретесь?
Dim DataStr as string
Dim h as string
dim i as integer
for i= 0 to 9
datastr = datastr & i
next i
dim l as long
for i= 1 to 4
l = int(rnd * 10) + 1
h = h & mid(datastr, l,1)
datastr = mid(Datastr,1,l-1) & mid(Datastr, l+)
next i
MsgBox h
Номер ответа: 12
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #12
Добавлено: 23.04.07 14:33
Гы, VBD, кто здесь? )
Номер ответа: 13
Автор ответа:
BG(Алексей)
Вопросов: 26
Ответов: 295
Профиль | | #13
Добавлено: 24.04.07 01:41
А так правильно будет?
Dim a As Integer
Dim Random As New Random
For i As Integer = 0 To 10
For j As Integer = 0 To 4
For jj As Integer = 0 To 99
a = Random.Next(1, 10)
If arrS(i, 0) = a Then Continue For
If arrS(i, 1) = a Then Continue For
If arrS(i, 2) = a Then Continue For
If arrS(i, 3) = a Then Continue For
If arrS(i, 4) = a Then Continue For
arrS(i, j) = a
Exit For
Next
Next
Next
Номер ответа: 14
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #14
Добавлено: 24.04.07 02:05
Ты запустить-то хоть пробовал?
Номер ответа: 15
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #15
Добавлено: 24.04.07 02:07
Dim Random As New Random
For i As Integer = 0 To 10
For j As Integer = 0 To 4
For jj As Integer = 0 To 99
a = Random.Next(1, 10)
Do While Array.IndexOf(arrS, a) = -1
a = Random.Next(1, 10)
Loop
arrS(i, j) = a
Next
Next
Next