PowerShell, 43 bytes (Iterative method)
param($n)for(;!((do{$x+=1..$n|random)%$n)){}until($x%$n)$x
PowerShell, 48 bytes (recursive method)
filter f{if($_-eq($x=1..$_|random)){$x+=$_|f}$x}
PowerShell, 43 bytes (Iterative method)
param($n)for(;!(($x+=1..$n|random)%$n)){}$x
PowerShell, 48 bytes (recursive method)
filter f{if($_-eq($x=1..$_|random)){$x+=$_|f}$x}
PowerShell, 43 bytes (Iterative method)
param($n)do{$x+=1..$n|random}until($x%$n)$x
PowerShell, 48 bytes (recursive method)
filter f{if($_-eq($x=1..$_|random)){$x+=$_|f}$x}
PowerShell, 43 bytes (Iterative method)
param($n)for(;!(($x+=1..$n|random)%$n)){}$x
PowerShell, 48 bytes (recursive method)
filter f{if($_-eq($x=1..$_|random)){$x+=$_|f}$x}