You could try to shuffle the items yourself by swapping memory.
https://en.wikipedia.org/wiki/Fisher–Yates_shuffle
If it still isn't fast enough and a pseudo random is good enough, the whole procedure could be done with asm.
Code:
DeclareModule SwapMemory
Declare SwapMemory(*m1, *m2, size)
EndDeclareModule
Module SwapMemory
DisableDebugger
EnableASM
CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
Macro rax : eax : EndMacro
Macro rcx : ecx : EndMacro
Macro rdx : edx : EndMacro
Macro rdi : edi : EndMacro
Macro rsi : esi : EndMacro
CompilerEndIf
Procedure SwapMemory(*m1, *m2, size)
mov rax, [p.p_m1]
mov rdx, [p.p_m2]
mov ecx, [p.v_size]
push rsi
push rdi
mov rsi, rax
mov rdi, rdx
sub ecx, 4
!jc .l1
!.l0:
mov eax, [rsi + rcx]
mov edx, [rdi + rcx]
mov [rdi + rcx], eax
mov [rsi + rcx], edx
sub ecx, 4
!jnc .l0
!.l1:
add ecx, 3
!jnc .l3
!.l2:
movzx eax, byte [rsi + rcx]
movzx edx, byte [rdi + rcx]
mov [rdi + rcx], al
mov [rsi + rcx], dl
sub ecx, 1
!jnc .l2
!.l3:
pop rdi
pop rsi
EndProcedure
EndModule
Structure house
name.s
x.l
y.l
EndStructure
Dim house.house(3, 10)
; Generate sorted array
For x = 0 To 3
For y = 0 To 10
With house (x, y)
\name = "house " + Str(x) + "," + Str(y)
\x = x
\y = y
EndWith
Next
Next
; Randomize house 2, 2 - 7
interval_start = 2
interval_end = 7
For i = interval_start To interval_end - 1
j = Random(interval_end, i)
SwapMemory::SwapMemory(@house(2, i), @house(2, j), SizeOf(house))
Next
; Show results for house 2
For y = 0 To 10
Debug house(2, y)\name
Next