Вопрос: Random | Добавлено: 23.04.07 00:10 |
Автор вопроса: ![]() |
Мне нужно, что бы числа в строке не повторялись.
Почему в строке, иногда, повторяються сгенерированные числа, что я делаю не правильно? ReDim arrS(10, 4)
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 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Вопросов: 130 Ответов: 6602 |
Профиль | Цитата | #1 | Добавлено: 23.04.07 00:36 |
Randomize инициализирует генератор случайных чисел таймером.
Судя по всему во время выполнения цикла значение таймера не успевает измениться поэтому каждый раз генератор инициализируется одним и тем же числом, поэтому и числа генерируются одинаковые. Вобщем перенеси Randomize в самое начало процедуры. Вот рабочий код, написанный на VB .NET (а не VB .NET like VB6) Dim Arr(10, 4) As Integer
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 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 26 Ответов: 295 |
Профиль | Цитата | #2 | Добавлено: 23.04.07 01:07 |
Спасибо, сейчас попробую. |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 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 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Вопросов: 130 Ответов: 6602 |
Профиль | Цитата | #4 | Добавлено: 23.04.07 01:56 |
Dim Arr(10, 4) As Integer
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() 8 2 2 4 10
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 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 26 Ответов: 295 |
Профиль | Цитата | #5 | Добавлено: 23.04.07 02:05 |
В одной строке два одинаковых числа исключено.
Генерировать я должен от 1 до 50. Дополнительный вопрос: Можно ли сделать так, чтоб в одной строке все цифры шли по возрастанию. Это для того, что бы в дальнейшем избежать сортировки. |
Номер ответа: 6 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client Вопросов: 236 Ответов: 8362 |
Профиль | Цитата | #6 | Добавлено: 23.04.07 02:17 |
Мне кажеться, если такое грубое условие
В одной строке два одинаковых числа исключено то при генирации слудующего числа для строки, нужно тут же пересматривать всю строку, а нет ли в ней уже сгенерированного числа? Если есть, то чисто что сгенерировалось выкинуть, и генерировать до тех пор пока новое случайное чисто будет действительно уникальными в данной строке...
|
Номер ответа: 7 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 26 Ответов: 295 |
Профиль | Цитата | #7 | Добавлено: 23.04.07 02:36 |
Да, наверно так и прийдётся делать.
Но от этого упадет проиводительность, ведь строчек может быть около 15000. |
Номер ответа: 8 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Вопросов: 130 Ответов: 6602 |
Профиль | Цитата | #8 | Добавлено: 23.04.07 02:42 |
Если бы ты с самого начала объяснил что тебе нужно, было бы намного проще.
Что за задача стоит? |
Номер ответа: 9 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 26 Ответов: 295 |
Профиль | Цитата | #9 | Добавлено: 23.04.07 02:57 |
Сразу и по порядку.
Делаю MDI приложение. Работать оно будет исключительно с цифрами от 1 до 200. Все номера беруться из БД в массив, а потом в разных окнах идет работа с ними ( делятся на массивы, на группы, на подгруппы и тд). Но я должен (иногда) управлять ими, а именно генерировать новые значения. Вообщем Бред сумашедшего. Но самое главное, это то, что я абссолютный начинающий, учусь по книге Шевякова, Степанова, Карпова "Самоучитель Visual Basic 2005". Когда захожу в тупик, обращаюсь к Вам. За объяснениями. |
Номер ответа: 10 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 26 Ответов: 295 |
Профиль | Цитата | #10 | Добавлено: 23.04.07 03:40 |
...нужно тут же пересматривать всю строку, а нет ли в ней уже сгенерированного числа? Если есть, то чисто что сгенерировалось выкинуть...
Сделал, всё работает. Но хотелось бы по-короче. Всем спасибо. |
Номер ответа: 11 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 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 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client Вопросов: 236 Ответов: 8362 |
Профиль | Цитата | #12 | Добавлено: 23.04.07 14:33 |
Гы, VBD, кто здесь? ![]() |
Номер ответа: 13 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 26 Ответов: 295 |
Профиль | Цитата | #13 | Добавлено: 24.04.07 01:41 |
А так правильно будет?
ReDim arrS(10, 4)
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 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Вопросов: 130 Ответов: 6602 |
Профиль | Цитата | #14 | Добавлено: 24.04.07 02:05 |
Ты запустить-то хоть пробовал? |
Номер ответа: 15 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Вопросов: 130 Ответов: 6602 |
Профиль | Цитата | #15 | Добавлено: 24.04.07 02:07 |
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) Do While Array.IndexOf(arrS, a) = -1 a = Random.Next(1, 10) Loop arrS(i, j) = a Next Next Next |
|