Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 |

 

  Вопрос: Randomizing Добавлено: 12.09.09 22:05  

Автор вопроса:  DkBobby
Всем доброго времени суток! Такая ситуация: делаю игру карточную и соответственно неплохо бы "перетасовать" "карты".


Sub RandomPack()
Dim RandomNumber As Integer
    For i = 1 To 36 Step 1
MakeRandomNumber:
    RandomNumber = Int(Rnd(1) * 36)             'создание рандомного числа
        If Numbers(RandomNumber) = 0 And RandomNumber > 0   Then 'проверка занято ли уже число другой картой и больше ли оно нуля
        Cards(i) = RandomNumber 'присваивание карте номера
        Numbers(RandomNumber) = 1 'присваивание значения "занятого" номеру
        Else
        GoTo MakeRandomNumber
        End If
    Next
End Sub


Соотвественно массивы в General:

Dim Cards(1 To 36) As Integer
Dim Numbers(1 To 36) As Integer


После N-кол-ва похождений цикла (смотрел по построчному дебагу) программа, видимо, входит в бесконечный цикл, от чего зависает и становится "Not responsing". Пробовал по-разному делать, но тогда выдается ошибка номер 9 "Subscript out range" (или что-то вроде того). Подскажите пожалуйста что нетак и как исправить? Заранее спасибо.

Ответить

  Ответы Всего ответов: 15  

Номер ответа: 1
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #1
Добавлено: 12.09.09 22:46
  1. RandomNumber = Int(Rnd(1) * 36) + 1

Ответить

Номер ответа: 2
Автор ответа:
 DkBobby



Вопросов: 6
Ответов: 20
 Профиль | | #2 Добавлено: 12.09.09 23:06
Спасибо

Ответить

Номер ответа: 3
Автор ответа:
 DkBobby



Вопросов: 6
Ответов: 20
 Профиль | | #3 Добавлено: 12.09.09 23:17
всё равно зависает...

Ответить

Номер ответа: 4
Автор ответа:
 DkBobby



Вопросов: 6
Ответов: 20
 Профиль | | #4 Добавлено: 12.09.09 23:18
может обновление какое-нибудь нужно, не знаете?

Ответить

Номер ответа: 5
Автор ответа:
 Boconon



ICQ: 216390557 

Вопросов: 25
Ответов: 71
 Web-сайт: microsoft.com
 Профиль | | #5
Добавлено: 12.09.09 23:49
походу цикл доходит до конца, генерит значение... а так как все карты уже заняты.... перебирает снова и снова... уходит в астрал? очень нечитабельный и не удобный кодо, имхо, убери goto, реализуй циклами.

Ответить

Номер ответа: 6
Автор ответа:
 DkBobby



Вопросов: 6
Ответов: 20
 Профиль | | #6 Добавлено: 12.09.09 23:55
так карт 36 и цикл после 36 раза должен закончиться...

Ответить

Номер ответа: 7
Автор ответа:
 DkBobby



Вопросов: 6
Ответов: 20
 Профиль | | #7 Добавлено: 12.09.09 23:56
номеров 36 и карт тоже 36 и номера должны рандомно распределится по картам..

Ответить

Номер ответа: 8
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #8
Добавлено: 12.09.09 23:57
лучше заведи массив из 36 элементов. рандомом получаешь индекс элемента. сохраняешь его в массив результата, элемент из исходного массива удаляешь. далее уменьшаем делитель на 1. и так. типа как то так

while(source_array.size() > 0){
    int cur_index = rnd() % source_array.size();
    result_array.add( source_array.get_item( cur_index ) );
    source_array.remove( cur_index );
}

типа как то так. детали типа удаления, добавления етц - обернуты в класс дабы не мешать пониманию алгоритма.

Ответить

Номер ответа: 9
Автор ответа:
 DkBobby



Вопросов: 6
Ответов: 20
 Профиль | | #9 Добавлено: 13.09.09 00:05
к сожалению VB не дает возможности считать кол-во элементов массива. по крайней мере я не смог найти функу такую..

Ответить

Номер ответа: 10
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #10
Добавлено: 13.09.09 00:12
дело в том что это не просто массивы. из середины массива удалять просто так нельзя. нужно его перекопировать в новый. для упрощения всего этого шаманства нужно сделать свой класс, который спрячет эти возможности. по сути же самым удобным для этого алгоритма структурой данных является обычный односвязный список.

Ответить

Номер ответа: 11
Автор ответа:
 DkBobby



Вопросов: 6
Ответов: 20
 Профиль | | #11 Добавлено: 13.09.09 00:16
ясно. спасибо

Ответить

Номер ответа: 12
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #12
Добавлено: 13.09.09 15:31
  1. int a[36]; for (int i = 0; i <  36; ++i) a = i;
  2. for (int i = 0; i < 36; ++i) swap(a, a[rand(i, 36)]);

Ответить

Номер ответа: 13
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #13
Добавлено: 13.09.09 16:00
тож хороший вариант

Ответить

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



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #14 Добавлено: 13.09.09 18:26
  1.     <Extension()> _
  2.     Public Function GetRandom(Of T)(ByVal source As T(), ByVal count As Integer) As T()
  3.         If source.Length < count Then count = source.Length
  4.  
  5.         Dim TempArr = CType(source.Clone, T())
  6.         Dim Result(count - 1) As T
  7.  
  8.  
  9.  
  10.         For i = 0 To count - 1
  11.             Dim Pos = RndInt(source.Length - i)
  12.             Result(i) = TempArr(Pos)
  13.             TempArr(Pos) = TempArr(TempArr.Count - 1 - i)
  14.         Next
  15.         Return Result
  16.     End Function

Ответить

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



Вопросов: 6
Ответов: 20
 Профиль | | #15 Добавлено: 16.09.09 21:21
всем спасибо, проблема разрешилась. сделал всё же по своему (код всё такой же нечитабельный))):

  1.  
  2. Dim random As Integer
  3. For y = 1 To 36 Step 1
  4. Cards(y) = 0
  5. Numbers(y) = 0
  6. Next
  7.  
  8.     For i = 1 To 36 Step 1
  9.     random = Int(Rnd * 36)
  10.     If random = 0 Then
  11.     random = random + 1
  12.     End If
  13.         If Numbers(random) = 0 Then
  14.         Cards(i) = random
  15.         Numbers(random) = 1
  16.         Else
  17.             For j = 1 To 36 Step 1
  18.                 If Numbers(j) = 0 Then
  19.                 Cards(i) = j
  20.                 Numbers(j) = 1
  21.                 GoTo Nextitem
  22.                 End If
  23.             Next
  24.         End If
  25. Nextitem:
  26.     Next

Ответить

Страница: 1 |

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



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