Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 | 2 |

 

  Вопрос: Random Добавлено: 23.04.07 00:10  

Автор вопроса:  BG(Алексей)
Мне нужно, что бы числа в строке не повторялись.
Почему в строке, иногда, повторяються сгенерированные числа, что я делаю не правильно?
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
Автор ответа:
 Artyom



Разработчик

Вопросов: 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
Автор ответа:
 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 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
Автор ответа:
 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
А так правильно будет?
        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
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #14 Добавлено: 24.04.07 02:05
Ты запустить-то хоть пробовал?

Ответить

Номер ответа: 15
Автор ответа:
 Artyom



Разработчик

Вопросов: 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

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам